这是一个基本解决方案
function array_find($xs, $f) {
foreach ($xs as $x) {
if (call_user_func($f, $x) === true)
return $x;
}
return null;
}
array_find([1,2,3,4,5,6], function($x) { return $x > 4; }); // 5
array_find([1,2,3,4,5,6], function($x) { return $x > 10; }); // null
在事件返回时,循环短路并立即返回。与 相比,这更适合我们的用例,因为在找到第一个正匹配项后不必继续迭代。$f($x)
true
$x
array_filter
array_find
如果回调从不返回 true,则返回值 。null
请注意,我使用的不仅仅是调用.这在这里是合适的,因为它允许您使用任何兼容的可调用call_user_func($f, $x)
$f($x)
Class Foo {
static private $data = 'z';
static public function match($x) {
return $x === self::$data;
}
}
array_find(['x', 'y', 'z', 1, 2, 3], ['Foo', 'match']); // 'z'
当然,它也适用于更复杂的数据结构。
$data = [
(object) ['id' => 1, 'value' => 'x'],
(object) ['id' => 2, 'value' => 'y'],
(object) ['id' => 3, 'value' => 'z']
];
array_find($data, function($x) { return $x->id === 3; });
// stdClass Object (
// [id] => 3
// [value] => z
// )
如果您使用的是 PHP 7,请添加一些类型提示
function array_find(array $xs, callable $f) { ...