条件数组的第一个元素

sim*_*.ro 2 php array-filter

我正在寻找一种优雅的方法来获取满足给定条件的数组的第一个(也是第一个)元素。

简单的例子:

输入:

[
    ['value' => 100, 'tag' => 'a'],
    ['value' => 200, 'tag' => 'b'],
    ['value' => 300, 'tag' => 'a'], 
 ]
Run Code Online (Sandbox Code Playgroud)

条件: $element['value'] > 199

预期产量:

['value' => 200, 'tag' => 'b']
Run Code Online (Sandbox Code Playgroud)

我自己想出了几种解决方案:

  1. 遍历数组,检查条件并在找到时中断

  2. 使用array_filter施加条件并获取已过滤的第一个值:

    array_values(
        array_filter(
            $input, 
            function($e){
                return $e['value'] >= 200;
            }
        )
    )[0];
    
    Run Code Online (Sandbox Code Playgroud)

两者似乎都比较麻烦。有人有更清洁的解决方案吗?我是否缺少内置的php函数?

u_m*_*der 10

没有必要使用上述所有功能,如array_filter。因为array_filter 过滤器数组。而过滤是不一样的发现第一个值。所以,只需这样做:

foreach ($array as $key => $value) {
    if (meetsCondition($value)) {
        $result = $value;
        break;
        // or: return $value; if in function
    }
}
Run Code Online (Sandbox Code Playgroud)

array_filter将过滤整个数组。因此,如果您需要的值是第一个,并且数组有 100 个或更多元素,array_filter仍将检查所有这些元素。那么,你真的需要 100 次迭代而不是 1 次吗?答案很明确——


wil*_*lin 5

我能找到的最短的是使用current

current(array_filter($input, function($e) {...}));
Run Code Online (Sandbox Code Playgroud)

current本质上是获取第一个元素,false如果为空则返回。

如果经常重复执行代码,则最好将其提取为自己的函数。

  • 请注意它没有经过优化: array_filter 将对数组的每个元素执行您的函数,其中包括“获胜者”的所有后继者。它可能很重要(如果您的数组有数千个值),也可能不重要(如果它只有 3 个值)。 (7认同)
  • 谢谢!使用“current”肯定比使用“array_values”更好更快 (2认同)
  • 这个解决方案对于少量的项目来说是可以的,但是对于大数组来说,它的速度非常慢...... (2认同)