如何在PHP中找到第一个值大于X的数组元素?
我有一个带数值的数组,我想得到第一个元素的键,它的值等于或大于5。有没有比在如何在PHP中找到第一个值大于X的数组元素?,php,arrays,Php,Arrays,我有一个带数值的数组,我想得到第一个元素的键,它的值等于或大于5。有没有比在foreach中循环所有元素更优雅的方法 // "dirty" way foreach ([0, 0, 4, 4, 5, 7] as $key => $value) { if ($value >= 5) { echo $key; break; } } 算法本身非常好,不要碰它 也就是说,您可以通过编写通用搜索函数来添加一些功能区: // find first
foreach
中循环所有元素更优雅的方法
// "dirty" way
foreach ([0, 0, 4, 4, 5, 7] as $key => $value) {
if ($value >= 5) {
echo $key;
break;
}
}
算法本身非常好,不要碰它 也就是说,您可以通过编写通用搜索函数来添加一些功能区:
// 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;
});
现在,虽然这是一种更优雅的方法,但效率较低;在每个项目上调用闭包都有相当大的开销。如果性能是最重要的,请使用您拥有的并使用它运行。使用array\u search()
在查找最早出现的匹配时可能会很有效,但在这种情况下不合适,因为它不允许您为搜索提供所需的逻辑
使用函数迭代器,如array\u map()
和array\u filter()
并不理想,因为它们缺乏在匹配完成后立即“短路”的能力。在我自己的专业项目中,我不会使用函数式技术——即使是在一个相对较小的数据集上——因为这样做没有任何有价值的收益
考虑到上述情况,只需使用一个经典循环,循环体中有一个条件,即在排位赛发生时立即打破循环
$test
变量是在我的可运行演示链接中的测试用例循环中定义的。要试用下面的代码,请确保在进入循环之前将$test
定义为您的指针
数组值大于或等于指针的最早键:()
获取不大于指针的最大值的键。:()
为什么这么脏?我觉得这很好。。。也许使用
array\u walk
/array\u map
并将测试放在一个单独的函数中会更“干净”…我的意思是,如果存在内置的PHP函数,可以用更少的精力处理它。。。这个解决方案是有效的,我只是预先提供最好的解决方案,而不是好的解决方案(如果这不是最好的);这将是更多的代码,但也不一定更优雅。如果数组被排序(似乎在示例中),您可以使用快速排序方式-检查中间值并在每次迭代中丢弃一半…更有效。这非常整洁!这种功能的唯一限制是想象力。
$array = [0, 0, 4, 4, 5, 7];
$foundKey = 'not found';
foreach ($array as $key => $value) {
if ($value >= $test) {
$foundKey = $key;
break;
}
}
$array = [0, 0, 4, 4, 5, 7];
$foundKey = 'not found';
foreach ($array as $key => $value) {
if ($value > $test) {
break;
}
$foundKey = $key;
}