PHP array_rand()抛出我不期望的警告

时间:2017-06-28 15:53:03

标签: php

我正在调试我的php error_logs以查找我错过的通知,警告和错误。现在我使用php array_rand()函数来获取数组的1个元素。在正常情况下,这可以正常工作,但在我的php错误日志中,有一些关于使用array_rand()的代码的警告。

  

PHP警告:array_rand():第二个参数必须介于1和之间   数组中元素的数量......

我正在使用array_rand():

$arr =
    [
        3 => [
            999 => "10-G2",
            1366 => "11-B2",
            1481 => "14-C3",
        ]
    ];

$randomLoc = array_rand($arr[3], 1);

这将返回99913661481。如果此数组为空,

如果$arr[3]是emtpy,则会抛出空警告

  

警告:array_rand():

中的数组为空

如果未设置$arr[3],则会在警告

之前抛出未定义的偏移通知
  

注意:未定义的偏移量:

中的3

那么,如果没有未定义的偏移通知,怎么可能得到第二个参数必须介于1和... 之间?

3 个答案:

答案 0 :(得分:2)

很可能是因为您的数组不包含您认为包含的内容。例如,这个数组会给你这个错误:

$arr =
    [
        3 => []
    ];

$randomLoc = array_rand($arr[3], 1);

此外,如果我可以提出更一般的建议,您不必查看日志文件来查找这些内容。在您的开发环境中,您的系统应该主动告诉您某些内容是否已损坏。就我而言,脚本执行会停止并在屏幕上显示一条带有错误消息的回溯,用于任何错误:致命,未捕获的异常,错误和通知。

修改

你说:

  

如果$ arr [3]为emtpy,则会抛出空警告

事实并非如此。它可能取决于版本:我对array_rand不是很熟悉。我自己的测试表明:

$arr = [];
$val = array_rand( $arr );

$val设置为null结束。这样:

$arr = [];
$val = array_rand( $arr, 1 );

将准确触发您收到的错误:

  

PHP警告:array_rand():第二个参数必须介于1和之间   数组中元素的数量......

在任何情况下,我都不会收到有关空数组的错误。我使用的是PHP 7.0。

答案 1 :(得分:0)

$randomLoc = isset($arr[3]) && !empty($arr[3]) ? array_rand($arr[3], 1) : null 如果$ arr未设置或为空,将返回null值。

另外,您不必在日志文件中使用grep来查找这些错误。您的开发环境应该显示通知&警告。以下是有关错误报告的更多信息:http://php.net/manual/fr/function.error-reporting.php

答案 2 :(得分:0)

  

那么,如果没有未定义的偏移通知,怎么可能得到第二个参数必须介于1和...之间?

不是,但没关系,因为你也不想要那个警告。在将数组传递给array_rand()之前,请检查您是否有一个有效的数组:

if (
    is_array($arr) &&
    array_key_exists(3, $arr) &&
    is_array($arr[3]) &&
    !empty($arr[3])
) {
    $randomLoc = array_rand($arr[3]);
} else {
    $randomLoc = null; // or throw an error?
}

如果您使用的是PHP7 +,则可以使用新的??运算符一次执行相同操作:

$randomLoc = array_rand($arr[3] ?? [null]);