Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mencari Kunci secara Rekursif dalam Tatasusunan Multidimensi dalam PHP?

Bagaimana untuk Mencari Kunci secara Rekursif dalam Tatasusunan Multidimensi dalam PHP?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-02 15:58:30810semak imbas

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

Cari Secara Rekursif Kunci dalam Tatasusunan Berbilang Dimensi

Masalah:

Kaedah find() yang disediakan cuba untuk secara rekursif cari kunci tertentu dalam tatasusunan bersekutu dan kembalikan nilai yang berkaitan. Walau bagaimanapun, pelaksanaan rekursi mempunyai masalah.

Penyelesaian:

Isu dengan kod asal adalah berkaitan dengan rekursi. Ia cuba mengembalikan output panggilan rekursif secara langsung tanpa mengendalikan kes di mana tiada padanan ditemui pada tahap semasa. Ini boleh membawa kepada nilai pulangan yang salah bagi "tidak jumpa" tanpa mengira sama ada padanan wujud lebih dalam dalam tatasusunan.

Untuk membetulkannya, kod berikut boleh digunakan untuk mengendalikan rekursi dengan betul:

<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>

Fungsi yang dikemas kini ini menyemak sama ada hasil panggilan rekursif tidak "tidak ditemui", menunjukkan bahawa padanan ditemui pada tahap yang lebih mendalam. Dalam kes itu, ia mengembalikan nilai yang ditemui. Jika tidak, ia mengembalikan nilai "tidak jumpa" seperti sebelumnya.

Penyelesaian Alternatif:

Dalam versi PHP moden (5.6 dan ke atas), penyelesaian alternatif menggunakan iterator dan /atau penjana boleh menjadi lebih cekap dan elegan:

<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>

Fungsi ini menggunakan iterator untuk melintasi tatasusunan berbilang dimensi dengan cekap dan mencari kunci padanan pertama.

Selain itu, penjana boleh digunakan untuk mengulang atas semua elemen padanan, bukan hanya yang pertama:

<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>

Atas ialah kandungan terperinci Bagaimana untuk Mencari Kunci secara Rekursif dalam Tatasusunan Multidimensi dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn