我正在寻找性能最友好的方法来检查数组中的所有值是否为null,或者是否至少有一个元素具有其他类型。
也就是说,我需要一个方法,它根据传递的数组返回布尔值
例如:
$a = containsOnlyNull([null,null,null,null,null]);
$b = containsOnlyNull([null,null,1,null,null]);
// $a will be true
// $b will be false
我喜欢使用数组。此方法统计非null项,如果大于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_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
输出:
a: true
b: false
对于将提供相同布尔输出的函数迭代器,这里有一些示例(但我仍然在我自己的项目中直接使用上述技术)。(多技术演示)
-
(bool) array_reduce(
$payload,
function ($acc, $value) {
return $acc && $value === null;
},
true
)
!array_filter(
$payload,
function ($value) {
return $value !== null;
}
)
最简洁地说:
$payload === array_filter($payload, 'is_null')
function containsOnlyNull($input)
{
return empty(array_filter($input, function ($a) { return $a !== null;}));
}
问题内容: 我正在从表单中添加一系列项目,如果所有项目都是空的,我想执行一些验证并将其添加到错误字符串中。所以我有: 然后,如果所有数组元素均为空,请执行: 问题答案: 您可以只使用内置的array_filter 如果未提供回调,则将删除所有等于FALSE的输入项(请参阅转换为布尔值)。 因此可以在一条简单的代码行中做到这一点。
问题内容: 在Java中,给定一个值数组(例如整数),是否有一种方法可以有效地检查它们是否都具有特定值? 例如,使用整数数组,例如: 并且只有在所有条件均为2的情况下,您才需要执行一项操作?有没有比这更有效的方法: 我知道可以用C ++做到这一点,但是Java呢? 问题答案: 或者,如果使用Java 8,则可以执行以下操作: 基本上,使用Streams可以非常简洁地完成与集合/数组有关的所有操作。
问题内容: 我需要确定数组中是否存在值。 我正在使用以下功能: 上面的函数总是返回false。 数组值和函数调用如下: 问题答案: 你可以像这样使用它:
问题内容: 我想找出$ all是否包含所有$ search_this值并返回true或false。有什么想法吗? 问题答案: 看一下array_intersect()。
问题内容: 我有一个像这样的值: 给定,有没有一种很好的方法来测试是否包含? 问题答案: 警告:这不适用于图元数组(请参见注释)。 从开始,你现在可以使用。 要检查的阵列是否,或包含一个值使用或分别。 例
问题内容: 如何确定在Java数组中是否包含特定值? 问题答案: 从java-8开始,你现在可以使用Streams。 要检查的阵列是否int,double或long包含一个值使用IntStream,DoubleStream或LongStream分别。 例 Java SE 9的简要更新 引用数组不好。对于这种情况,我们要紧紧追赶。从Java SE 9开始,我们有了。 “给出String,是否有测试V