これが基本的な解決策です
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
イベントreturnでは、ループが短絡し、すぐに返されます$f($x)
。と比較すると、最初の肯定的な一致が見つかった後に反復を続ける必要がないため、これは私たちのユース ケースに適しています。true
$x
array_filter
array_find
コールバックが true を返さない場合は、値null
が返されます。
call_user_func($f, $x)
を呼び出す代わりに使用したことに注意してください$f($x)
。これは、互換性のあるcallableを使用できるため、ここでは適切です。
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) { ...