问题:
提供的 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中文网其他相关文章!