确定PHP数组中的所有值是否为空

Ali*_*Ali 1 php arrays

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

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

例如:

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

// $a will be true
// $b will be false
Run Code Online (Sandbox Code Playgroud)

任何建议将被认真考虑 :)

mic*_*usa 9

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

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

尽管在某些开发人员看来很无聊,但经典循环提供了提前中断的能力。这个任务可以用功能式的单线完成吗?是的,但它不会胜过这个片段。

代码:(演示

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
Run Code Online (Sandbox Code Playgroud)

输出:

a: true
b: false
Run Code Online (Sandbox Code Playgroud)

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

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

    $payload === array_filter($payload, 'is_null')
    
    Run Code Online (Sandbox Code Playgroud)


Man*_*tas 8

function containsOnlyNull($input)
{
    return empty(array_filter($input, function ($a) { return $a !== null;}));
}
Run Code Online (Sandbox Code Playgroud)