57

find_if()基本的に、C++や Smalltalkdetect:などの機能を利用できるようにしたいと考えています。

// would return the element or null
check_in_array($myArray, function($element) { return $elemnt->foo() > 10; });

しかし、これを行うPHP関数は知りません。私が思いついた1つの「近似」:

$check = array_filter($myArray, function($element) { ... });
if ($check) 
    //...

これの欠点は、コードの目的がすぐには明確にならないことです。また、要素が見つかった場合でも、配列の反復を停止しませんが、これはちょっとした問題です (データセットが問題を引き起こすほど大きい場合、線形検索は答えになりません)。

4

6 に答える 6

73

配列から最初のものを引き出す、または返すにはfalse

current(array_filter($myArray, function($element) { ... }))

current() の詳細については、こちらをご覧ください

于 2013-01-08T22:09:25.890 に答える
53

これが基本的な解決策です

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$xarray_filterarray_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) { ...
于 2016-03-09T02:51:20.013 に答える
1

プリミティブ反復関数\iter\search()の niic のiter ライブラリから使用します。配列と Traversableコレクションの両方で動作するという追加の利点があります。

$foundItem = \iter\search(function ($item) {
    return $item > 10;
}, range(1, 20));

if ($foundItem !== null) {
    echo $foundItem; // 11
}
于 2016-03-08T18:47:43.033 に答える
0

ループにすぎませんが、このような関数を自分で作成できます。

たとえば、この関数を使用すると、コールバック関数を渡すことができます。コールバックは、0 または値を返すことができます。指定したコールバックは、10 より大きい場合は整数を返します。コールバックが null 以外の値を返すと、関数は停止します。

function check_in_array(array $array, $callback)
{
  foreach($array as $item)
  {
    $value = call_user_func($callback, $item);
    if ($value !== null)
      return $value;
  }
}

$a = array(1, 2, 3, 6, 9, 11, 15);
echo check_in_array($a, function($i){ return ($i > 10?$i:null); });
于 2013-01-08T22:15:39.870 に答える
-79

独自の関数を作成できます ;)

function callback_search ($array, $callback) { // name may vary
    return array_filter($array, $callback);
}

これは役に立たないように思えるかもしれませんが、セマンティクスを向上させ、読みやすさを向上させることができます

于 2013-01-08T22:08:33.963 に答える