ホームページ >バックエンド開発 >PHPチュートリアル >PHP で多次元配列内のキーを再帰的に検索するにはどうすればよいですか?

PHP で多次元配列内のキーを再帰的に検索するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-02 15:58:30897ブラウズ

How to Recursively Search for a Key in a Multidimensional Array in PHP?

多次元配列内のキーを再帰的に検索

問題:

提供された find() メソッドは再帰的に検索を試みます連想配列内の特定のキーを検索し、関連付けられた値を返します。ただし、再帰の実装には問題があります。

解決策:

元のコードの問題は再帰に関連しています。現在のレベルで一致が見つからない場合は処理せずに、再帰呼び出しの出力を直接返そうとします。これにより、一致が配列の奥深くに存在するかどうかに関係なく、「見つかりませんでした」という誤った戻り値が発生する可能性があります。

これを修正するには、次のコードを使用して再帰を正しく処理できます。

<code class="php">private function find($needle, $haystack) {
    foreach ($haystack as $name => $file) {
        if ($needle == $name) {
            return $file;
        } else if(is_array($file)) { //is folder
            $result = $this->find($needle, $file); //file is the new haystack
            if ($result !== "did not find") {
                return $result;
            }
        }               
    }
    
    return "did not find";
}</code>

この更新された関数は、再帰呼び出しの結果が「見つからなかった」かどうかをチェックし、より深いレベルで一致が見つかったことを示します。その場合、見つかった値を返します。それ以外の場合は、以前と同様に「見つかりませんでした」値を返します。

代替ソリューション:

最新の PHP バージョン (5.6 以降) では、反復子と反復子を利用した代替ソリューションが使用されます。 /または、ジェネレーターをより効率的かつエレガントにすることができます:

<code class="php">function recursiveFind(array $haystack, $needle)
{
    $iterator  = new RecursiveArrayIterator($haystack);
    $recursive = new RecursiveIteratorIterator(
        $iterator,
        RecursiveIteratorIterator::SELF_FIRST
    );
    foreach ($recursive as $key => $value) {
        if ($key === $needle) {
            return $value;
        }
    }
}</code>

この関数はイテレーターを使用して、多次元配列を効率的に走査し、最初に一致するキーを見つけます。

さらに、ジェネレーターを使用して反復処理を行うこともできます。最初の要素だけでなく、一致するすべての要素に対して:

<code class="php">function recursiveFind(array $haystack, $needle)
{
    $iterator  = new RecursiveArrayIterator($haystack);
    $recursive = new RecursiveIteratorIterator(
        $iterator,
        RecursiveIteratorIterator::SELF_FIRST
    );
    foreach ($recursive as $key => $value) {
        if ($key === $needle) {
            yield $value;
        }
    }
}

// Usage
foreach (recursiveFind($haystack, $needle) as $value) {
    // Use `$value` here
}</code>

以上がPHP で多次元配列内のキーを再帰的に検索するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。