这是一个基本的解决方案
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) { ...