Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk Mencari Kunci secara Rekursif dalam Tatasusunan Multidimensi dalam PHP?
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!