确定平面数组中的所有值是否都为空

问题描述 投票:0回答:5

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

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

例如:

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

// $a will be true
// $b will be false
php arrays validation null
5个回答
34
投票
function containsOnlyNull($input)
{
    return empty(array_filter($input, function ($a) { return $a !== null;}));
}

11
投票

由于您的主要目标是“最性能友好”,那么您需要尽早设计一个能够“短路”或

break
/
return
的脚本。 否则,在确定存在非空值后,您将进行不必要的迭代。

不必要的迭代是此任务的所有函数式迭代技术的一个不幸的副作用,因为它们只能迭代完整的数据集——例如

array_filter()
array_walk()
array_map()
array_reduce()
等)。


编辑 从 PHP8.4 开始,开发人员不再需要利用“无聊”的易碎结构来享受最佳性能。 新的本机函数

array_all()
是专门为性能而设计的,因为遇到错误评估时会发生条件短路。 演示Polyfills

var_export(
    array_all($array, fn($v) => is_null($v))
);

不幸的是,

array_all($array, is_null(...))
将不起作用,因为
array_all()
value
key
参数发送到回调,而
is_null()
期望最多一个参数。


对于一些开发人员来说,这可能看起来很无聊,但经典循环提供了提前中断的能力。 这项任务可以通过功能性风格的单行来完成吗?是的,但它不会优于此片段。

代码:(演示

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

对于将提供相同布尔输出的函数迭代器,这里有一些示例(但出于直接性,我仍然会在我自己的项目中使用上述技术)。 (多技术演示)

  1. array_reduce($payload, fn($acc, $v) => $acc && $v === null, true)
    
  2. !array_filter($payload, fn($v) => $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


3
投票

您可以简单地使用 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;

1
投票

您可以将数组直接减少为布尔值:

array_reduce($payload, function (bool $acc, $value) {
    return !$acc ? $acc : $value === null;
}, true);
© www.soinside.com 2019 - 2024. All rights reserved.