如果检查了数组的所有值,如何引发错误?

时间:2018-06-26 07:40:38

标签: php

我写了一个小函数,它有一个带有值列表的数组,我希望能够调用该函数,传递一个$ 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

5 个答案:

答案 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()只会返回源数组中的项目数