多次元配列内でキー値のペアが見つかったすべてのサブ配列を高速に取得する方法はありますか? 配列の深さがどれくらいになるかはわかりません。
簡単な配列の例:
$arr = array(0 => array(id=>1,name=>"cat 1"),
1 => array(id=>2,name=>"cat 2"),
2 => array(id=>3,name=>"cat 1")
);
key=name および value="cat 1" を検索すると、関数は次を返します。
array(0 => array(id=>1,name=>"cat 1"),
1 => array(id=>3,name=>"cat 1")
);
最も深いレベルに到達するには、関数を再帰的に実行する必要があると思います。
ベストアンサー1
コード:
function search($array, $key, $value)
{
$results = array();
if (is_array($array)) {
if (isset($array[$key]) && $array[$key] == $value) {
$results[] = $array;
}
foreach ($array as $subarray) {
$results = array_merge($results, search($subarray, $key, $value));
}
}
return $results;
}
$arr = array(0 => array(id=>1,name=>"cat 1"),
1 => array(id=>2,name=>"cat 2"),
2 => array(id=>3,name=>"cat 1"));
print_r(search($arr, 'name', 'cat 1'));
出力:
Array
(
[0] => Array
(
[id] => 1
[name] => cat 1
)
[1] => Array
(
[id] => 3
[name] => cat 1
)
)
$results
効率が重要な場合は、次のように、配列を結合するのではなく、すべての再帰呼び出しの結果を同じ一時配列に格納するように記述できます。
function search($array, $key, $value)
{
$results = array();
search_r($array, $key, $value, $results);
return $results;
}
function search_r($array, $key, $value, &$results)
{
if (!is_array($array)) {
return;
}
if (isset($array[$key]) && $array[$key] == $value) {
$results[] = $array;
}
foreach ($array as $subarray) {
search_r($subarray, $key, $value, $results);
}
}
ここで重要なのは、search_r
4 番目のパラメータを値ではなく参照で受け取ることです。アンパサンド&
が重要です。
参考までに:古いバージョンのPHPを使用している場合は、電話宣言ではなくに記述しますsearch_r
。つまり、最後の行は になりますsearch_r($subarray, $key, $value, &$results)
。