【问题标题】:PHP array_rand() throws warning I don't expectPHP array_rand() 会抛出我没想到的警告
【发布时间】:2017-06-28 15:53:02
【问题描述】:

我正在调试我的 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] 为空,则会抛出空警告

警告:array_rand(): 数组为空

如果$arr[3]未设置,则会在警告前抛出未定义的偏移通知

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

那么,如何在没有未定义偏移通知的情况下获得 Second argument must be between 1 and... 警告?

【问题讨论】:

    标签: php


    【解决方案1】:

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

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

    此外,如果我可以提出更一般的建议,您不必查看日志文件即可找到这些内容。在您的开发环境中,您的系统应该主动告诉您是否有问题。在我的例子中,脚本执行停止并在屏幕上打印回溯并显示错误消息,对于 any 错误:致命、未捕获的异常、错误和通知。

    编辑:

    你说:

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

    这不是真的。它可能取决于版本:我对 array_rand 不是很熟悉。我自己的测试表明:

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

    将以 $val 设置为 null 结束。这个:

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

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

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

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

    【讨论】:

    • 本地我使用 PHP 7.1,抛出一个空警告。 PHP 7.0 确实在抛出,第二个参数必须介于 1.. 警告之间。还有我的问题,错误日志来自 PHP 7.0(生产),我的开发环境已经在 PHP 7.1
    • 有趣。我在 PHP 手册中检查了 array_rand 函数的更改日志,并没有在警告消息中提及此更改。它也没有提及实际的警告信息。它确实提到了 PHP 7.1 中的更改,但与此无关:奇怪的是,这个“功能”没有记录在案。
    【解决方案2】:

    $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

    【讨论】:

      【解决方案3】:

      那么,如果没有未定义的偏移通知,如何获得 Second 参数必须介于 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]);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-30
        • 2014-09-25
        • 1970-01-01
        • 1970-01-01
        • 2017-08-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多