如何在PHP中找到第一个值大于X的数组元素?

如何在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

我有一个带数值的数组,我想得到第一个元素的键,它的值等于或大于5。有没有比在
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;
}