对于规范参考:
$obj = array_column($array, null, 'id')['one'] ?? false;
The false
根据问题要求返回 false。它代表不匹配的值,例如你可以做到null
例如作为替代建议。
从 PHP 7.0 开始,这是透明的。如果您(仍然)拥有旧版本,则可以将其用户空间实现用作直接替代版本。
However array_column
也意味着复制整个数组。这可能是不需要的。
相反,它可以用来index数组,然后映射到array_flip
:
$index = array_column($array, 'id');
$map = array_flip($index);
$obj = $array[$map['one'] ?? null] ?? false;
在索引上,搜索问题可能仍然相同,地图仅提供原始数组中的索引,因此存在一个参考系统。
请记住,这可能不是必需的,因为 PHP 具有写时复制。因此,正如有意想象的那样,重复可能会更少。所以这是为了展示一些选项。
另一种选择是遍历整个数组,除非已经找到该对象,否则检查是否匹配。一种方法是使用array_reduce
:
$obj = array_reduce($array, static function ($carry, $item) {
return $carry === false && $item->id === 'one' ? $item : $carry;
}, false);
这个变体再次与返回false
不匹配的要求。
这是更直接一点null
:
$obj = array_reduce($array, static function ($carry, $item) {
return $carry ?? ($item->id === 'one' ? $item : $carry);
}, null);
然后可以添加不同的不匹配要求$obj = ...) ?? false;
例如。
充分暴露于foreach
在它自己的函数中甚至有在匹配时直接退出的好处:
$result = null;
foreach ($array as $object) {
if ($object->id === 'one') {
$result = $object;
break;
}
}
unset($object);
$obj = $result ?? false;
这实际上是原始答案由hsz https://stackoverflow.com/a/7106812/367456,这表明它的应用是多么普遍。