我正在寻找一种优雅的方法来获取满足给定条件的数组的第一个(也是第一个)元素。
简单示例:
输入:
[
['value' => 100, 'tag' => 'a'],
['value' => 200, 'tag' => 'b'],
['value' => 300, 'tag' => 'a'],
]
条件:$element['value'] > 199
预期输出:
['value' => 200, 'tag' => 'b']
我自己想出了几种解决方案:
遍历数组,检查条件并在找到时中断
使用array_filter施加条件并获取已过滤的第一个值:
array_values(
array_filter(
$input,
function($e){
return $e['value'] >= 200;
}
)
)[0];
两者看起来都比较麻烦。有人有更清洁的解决方案吗?我是否缺少内置的php函数?
答案 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次迭代吗?答案很明确-否。