【问题标题】:Determine if all the values in a PHP array are null判断 PHP 数组中的所有值是否为空
【发布时间】:2021-08-21 21:45:31
【问题描述】:

我正在寻找对性能最友好的方法来检查数组中的所有值是否为空,或者它是否至少有一个元素具有其他类型。

即我需要一个名为 containsOnlyNull($array) 的方法,它根据传递的数组返回布尔值

例如:

$a = containsOnlyNull([null,null,null,null,null]);
$b = containsOnlyNull([null,null,1,null,null]);

// $a will be true
// $b will be false

【问题讨论】:

  • array_reduce 或 array_walk_recursive 如果是多维数组
  • 我所尝试的与我接受的最佳答案非常相似,正如我正在寻找(潜在)更好的方法中提到的问题'私有函数 containsOnlyNull($array) { $filteredArray = array_filter( $array, function ($value) { return !is_null($value); } );返回计数($filteredArray)=== 0; }'

标签: php arrays


【解决方案1】:
function containsOnlyNull($input)
{
    return empty(array_filter($input, function ($a) { return $a !== null;}));
}

【讨论】:

    【解决方案2】:

    由于您的主要目标是“性能最友好”,因此您需要设计一个能够尽早“短路”或break/return 的脚本。否则,在确定存在非空值后,您将进行不必要的迭代。

    不必要的迭代是该任务的所有函数式迭代技术的一个不幸的副作用,因为它们只能迭代整个数据集——例如array_filter()array_walk()array_map()array_reduce()等)。

    虽然在某些开发人员看来很无聊,但经典循环提供了提前中断的能力。这个任务可以用一个函数式的单线来完成吗?是的,但它不会超过这个 sn-p。

    代码:(Demo)

    function containsOnlyNull(array $array): bool
    {
        foreach ($array as $value) {
            if ($value !== null) {
                return false;
            }
        }
        return true;
    }
    
    echo 'a: ' . var_export(containsOnlyNull([null,null,null,null,null]), true);  // 5 iterations for true outcome
    echo "\n";
    echo 'b: ' . var_export(containsOnlyNull([null,null,1,null,null]), true);  // 3 iterations for false outcome
    

    输出:

    a: true
    b: false
    

    至于提供相同布尔输出的函数式迭代器,这里有一些示例(但出于直接考虑,我仍会在我自己的项目中使用上述技术)。 (Multi-technique Demo)

    1. (bool) array_reduce(
          $payload,
          function ($acc, $value) {
              return $acc && $value === null;
          },
          true
      )
      
    2. !array_filter(
          $payload,
          function ($value) {
              return $value !== null;
          }
      )
      
    3. 最简洁的:

      $payload === array_filter($payload, 'is_null')
      

    【讨论】:

      【解决方案3】:

      我喜欢使用array_reduce。该方法对非空项进行计数,如果大于 0,则返回 false。否则,它返回 true。

      function containsOnlyNull($arr) {
          return array_reduce($arr, function($carry, $item) {
              return $carry += (is_null($item) ? 0 : 1);
          }, 0) > 0 ? false : true;
      }
      

      演示: IDEOne

      【讨论】:

      • 为什么不直接将数组简化为布尔值? array_reduce($payload, function (bool $acc, $value) { return !$acc ? $acc : $value === null; }, true);
      【解决方案4】:

      你可以简单地使用php的array_filter函数作为

      function containsOnlyNull($args){
          return count(array_filter($args,function($v){return $v !== null;})) === 0;
      }
      
      $a = containsOnlyNull([null,null,null,null,null]);
      $b = containsOnlyNull([null,null,1,null,null]);
      
      echo $a."<br>";
      echo $b;
      

      【讨论】:

      • null 和 0 不一样。但反对票不是我的^)
      • 我觉得callback也不需要@splash58
      • 还有更多回报 (count($result) === 0 ?
      • @splash58 找不到你?
      • 是的,这是一个 :),与@Mantas 建议的相同,除了使用 empty() 并检查计数 :)
      【解决方案5】:

      您可以将数组直接简化为布尔值:

      array_reduce($payload, function (bool $acc, $value) {
          return !$acc ? $acc : $value === null;
      }, true);
      

      【讨论】:

        猜你喜欢
        • 2018-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-20
        • 1970-01-01
        • 1970-01-01
        • 2013-09-27
        • 2015-05-03
        相关资源
        最近更新 更多