我有数值的数组,我想获得第一个元素的键,其值等于或大于5.是否有更优雅的方式而不是循环foreach
中的所有元素?
// "dirty" way
foreach ([0, 0, 4, 4, 5, 7] as $key => $value) {
if ($value >= 5) {
echo $key;
break;
}
}
答案 0 :(得分:6)
算法本身非常精细,请勿触摸它。
也就是说,您可以通过编写通用搜索功能来添加一些色带:
// find first key (from beginning of $a) for which the corresponding
// array element satisfies predicate $fn
function array_find(array $a, callable $fn)
{
foreach ($a as $key => $value) {
if ($fn($value, $key, $a)) {
return $key;
}
}
return false;
}
$key = array_find([0, 0, 4, 4, 5, 7], function($value) {
return $value >= 5;
});
现在,虽然这是一种更优雅的方法,但效率较低;在每个项目上调用闭包都有相当大的开销。如果性能至关重要,请使用您拥有的并运行它。
答案 1 :(得分:-1)
在查找最早出现的匹配时使用 array_search()
可能很有效,但在这种情况下不合适,因为它不允许您为搜索提供所需的逻辑。
使用 array_map()
和 array_filter()
等函数式迭代器并不理想,因为它们缺乏在匹配后立即“短路”的能力。在我自己的专业项目中,我不会使用函数式技术——即使是在相对较小的数据集上——因为这样做没有任何有价值的收益。
考虑到上述情况,只需使用一个在其主体中带有条件的经典循环,该条件在合格匹配发生时立即中断循环。
$test
变量是在我的可运行演示链接的测试用例循环中定义的。要在下面试用我的代码,请确保在进入循环之前将 $test
定义为您的指针。
数组值大于或等于针的最早键:(Demo)
$array = [0, 0, 4, 4, 5, 7];
$foundKey = 'not found';
foreach ($array as $key => $value) {
if ($value >= $test) {
$foundKey = $key;
break;
}
}
获取不大于针的最大值的key:(Demo)
$array = [0, 0, 4, 4, 5, 7];
$foundKey = 'not found';
foreach ($array as $key => $value) {
if ($value > $test) {
break;
}
$foundKey = $key;
}