1. ホーム
  2. php

[解決済み] PHPで多次元配列のkey=>valueで検索する方法

2022-04-25 10:02:31

質問

多次元配列の中でキーと値のペアが見つかった部分配列をすべて取得する高速な方法はありますか?配列の深さは言えません。

簡単な配列の例です。

$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 and value="cat 1"で検索すると、関数が返ってくるはずです。

array(0 => array(id=>1,name=>"cat 1"),
      1 => array(id=>3,name=>"cat 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) .