我写了一个小函数,它有一个带有值列表的数组,我希望能够调用该函数,传递一个$ amount参数,以便它从数组中返回特定数量的信息以及数据都是随机而独特的。
我被困在错误检查部分,如果我们已经烧完所有可用的数组列表,我想抛出一个错误。
function generate_array(int $amount){
$array = array(0 => array(1), 1 => array(2), 2 => array(3), 3 => array(4));
$count = 1;
$arr = array();
$tested = array();
while($count <= $amount){
$value = $array[array_rand($array)][0];
/**
* Error checking required
*/
if(!in_array($value, $tested)) array_push($tested, $value);
// here I need to check if all the values from $array has already been inserted in $tested or checked each one already
if(count($tested) === $array) throw new \exception('error');
/** End of error checks */
if(in_array($value, $arr)){
continue;
} else {
array_push($arr, $value);
$count++;
}
}
return $arr;
}
如果我们运行print_r(generate_array(4))
,我们将得到一个包含4个键的数组,但是如果我们使用5而不是4的参数值运行它,则循环将无限期地运行,这就是错误检查问题的所在,我想不出办法。
我已经包含了尝试添加错误的内容,但是它不起作用。
http://sandbox.onlinephpfunctions.com/code/3c00657740f7b9e88d0516ad1e5c7ee42807d213
答案 0 :(得分:1)
为什么不只在循环之前添加错误检查?
if (count($array) < $amount) {
return false;
}
while ($count <= $amount) ...
答案 1 :(得分:1)
此
if(!in_array($value, $tested)) array_push($tested, $value);
仅push
$value
进入$tested
,如果其中不存在。
此
if(count($tested) === $array) throw new \exception('error');
如果throw
中的元素数与Exception
相匹配,将仅$tested
$array
。因此,您正在比较苹果和橙子,并且当所有项目用完并且至少需要使用另一个元素时,您将陷入该烦人的无限循环中。因此,您需要比较元素的count
:
if(count($tested) === count($array)) throw new \Exception('error');
,您将需要在循环块的开头将其抛出。但是由于您从一开始就知道数组中将有多少个元素,因此可以在循环之前进行比较,如果条件不符合,则可以throw
进行例外处理:
if ($amount > count($array)) throw new Exception('error');
并观看代码中的案例,Exception
带有一个大E,这仅对您有效,因为您正在使用Windows。如果您在区分大小写的环境中运行此代码,则代码将崩溃。
答案 2 :(得分:0)
您可以做一百万件事,但是如果您希望在while()循环中这样做,只需在末尾添加:
if($count == $amount)
{
throw new \exception('error'); //If you want an error thrown
break; //If you want to exit the loop after the "last go"
}
或者,如果您想在循环开始时进行错误检查,则将条件更改为:
if($amount > $count)
{
throw new \exception('error'); //If you want an error thrown
break; //If you want to exit the loop
}
答案 3 :(得分:0)
您为什么还要使用循环开始?您只需要检查被调用方是否请求的数据超出可用数据($amount > count($array)
)的范围即可引发错误,然后仅对数组进行一次shuffle()
并将切片从0
返回到{{1 }}。这样一来,您只需要对数据数组进行一次混洗,就不会有无限循环。
答案 4 :(得分:0)
根据生成的数组是否可以稍作更改,可以简化整个代码...
function generate_array(int $amount){
$array = array(0 => 1, 1 => 2, 2 => 3, 3 => 4);
shuffle($array);
return ($amount <= count($array))?array_slice($array, 0, $amount):false;
}
这使用shuffle()
来混合数组,然后使用array_slice()
来获取所需数量的元素。
它使用$amount <= count($array)
来检查项目数,但是您可能会错过这一点,因为array_slice()
只会返回源数组中的项目数