PHP array_rand()抛出警告I don';别指望

PHP array_rand()抛出警告I don';别指望,php,Php,我正在调试我的php错误日志,以查找我错过的通知、警告和错误。现在我使用phparray\u rand()函数获取数组的1个元素。在正常情况下,这可以正常工作,但是在我的php错误日志中,有一些关于使用array\u rand()的代码的警告 PHP警告:array_rand():第二个参数必须介于1和 中数组中的元素数 我在中使用了array_rand(),如下所示: $arr = [ 3 => [ 999 => "10-G2",

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

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

我在中使用了array_rand(),如下所示:

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

$randomLoc = array_rand($arr[3], 1);
这将返回我
999
1366
1481
。如果此数组为空

如果
$arr[3]
是emtpy,它将抛出一个空警告

警告:array_rand():中的数组为空

如果
$arr[3]
未设置,它将在警告之前抛出一个未定义的偏移通知

注意:未定义的偏移量:3英寸


因此,如果第二个参数必须介于1和…之间,并且没有未定义的偏移量通知,那么如何才能获得警告呢?

很可能是因为数组不包含您认为它包含的内容。例如,此数组将显示以下错误:

$arr =
    [
        3 => []
    ];

$randomLoc = array_rand($arr[3], 1);
另外,如果我能提出一个更一般的建议,您不必通过查看日志文件来查找这些内容。在您的开发环境中,您的系统应该主动告诉您是否有问题。在我的例子中,脚本执行会停止,并将带有错误消息的回溯打印到屏幕,用于任何错误:致命、未捕获的异常、错误和通知

编辑:

你说:

如果$arr[3]是emtpy,它将抛出一个空警告

事实并非如此。这可能取决于版本:我不太熟悉数组。我自己的测试表明:

$arr = [];
$val = array_rand( $arr );
将以
$val
设置为空结束。这:

$arr = [];
$val = array_rand( $arr, 1 );
将准确触发您收到的错误:

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

在任何情况下,我都不会得到关于空数组的错误。我使用的是PHP7.0。

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

另外,您不必在日志文件中grep来查找这些错误。您的开发环境应该显示通知和警告。以下是有关错误报告的更多信息:

那么,如何可能得到第二个参数必须介于1和。。。没有未定义偏移通知的警告

不是,但那没关系,因为你也不想听到那个警告。在将数组传递给array_rand()之前,只需检查是否有有效数组:

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

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

在本地,我使用PHP7.1,抛出一个空警告。PHP7.0确实在抛出,第二个参数必须介于1。。警告还有我的fuckup,错误日志来自PHP7.0(生产),我的开发环境已经在PHP7.1Interest上了。我在PHP手册中查看了array_rand函数的更改日志,但它在警告消息中没有提到此更改。它也没有提到实际的警告信息。它确实提到了PHP7.1中的更改,但与此无关:这个“特性”没有文档记录,这很奇怪。
$randomLoc = array_rand($arr[3] ?? [null]);