首页 > 后端开发 > php教程 > 如何在 PHP 中递归搜索多维数组中的键?

如何在 PHP 中递归搜索多维数组中的键?

Mary-Kate Olsen
发布: 2024-11-02 15:58:30
原创
910 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板