条件数组的第一个元素

时间:2019-01-18 13:22:50

标签: php array-filter

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

简单示例:

输入:

[
    ['value' => 100, 'tag' => 'a'],
    ['value' => 200, 'tag' => 'b'],
    ['value' => 300, 'tag' => 'a'], 
 ]

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

预期输出:

['value' => 200, 'tag' => 'b']

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

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

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

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

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

3 个答案:

答案 0 :(得分:4)

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

current

current本质上是第一个元素,如果为空,则返回current(array_filter($input, function($e) {...}));

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

答案 1 :(得分:0)

您的数组:

$array = [
['value' => 100, 'tag' => 'a'],
['value' => 200, 'tag' => 'b'],
['value' => 300, 'tag' => 'a'], 
];

要通过条件查找条目,可以执行此操作

$newArray = array_values(array_filter($array, function($n){ return $n['value'] >= 101 && $n['value'] <= 400; }));

通过它可以设置值,最小和最大数字。

如果只想设置一个最小值,则可以这样省略最大值

$arrayByOnlyMin = array_values(array_filter($array, function($n){ return $n['value'] >= 199; }));

这将返回:

 array(2) {
 [0]=>
    array(2) {
      ["value"]=>
      int(200)
      ["tag"]=>
      string(1) "b"
    }
 [1]=>
   array(2) {
      ["value"]=>
      int(300)
      ["tag"]=>
      string(1) "a"
    }
}

因此致电$arrayByOnlyMin[0]会给您第一个符合您最低条件的条目。

答案 2 :(得分:0)

无需使用上述所有功能,例如array_filter。因为array_filter 过滤器数组。而且过滤查找第一个值不同。因此,只需执行以下操作:

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

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