PHP - 递归搜索数组的键和子键,成功时返回key['subkey']

3
所以我写了一个函数,在数组中搜索键和子键对,深度为两层。基本上它正在寻找key['subkey'],如果找到它,就会返回key['subkey']
我正在寻找的是一种真正递归的方法,可以搜索尽可能多的层次,直到它要么到达数组的末尾并被迫返回false,要么找到值并将其返回。
我完全不懂PHP,已经Google了几个小时也没有结果。任何指向正确方向的指针都将不胜感激。
这是函数:
function searchArray($array, $key, $subkey) {
    foreach ($array as $item){
        if (is_array($item) && isset($item[$key]) && isset($item[$key][$subkey])){
            return $item[$key][$subkey];
        } else {
            foreach ($item as $subitem){
                if (is_array($subitem) && isset($subitem[$key]) && isset($subitem[$key][$subkey])){
                    return $subitem[$key][$subkey]; 
                }
            }
        }
    }
}

示例数组:

"locales" => array(
    "America" => array(
        "locations" => array(
            "us" => array(
                "title" => "United States",
                "lang" => "en_US",
            ),
            "gl" => array(
            )
        )
    ),
    "Europe" => array(
        "locations" => array(
            "at" => array(
                "title" => "Österreich",
                "lang" => "de_DE",
            ),
            "fr" => array(
                "title" => "France",
                "lang" => "fr_FR",
            ),
            "de" => array(
                "title" => "Deutschland",
                "lang" => "de_DE",
            ),
            "it" => array(
                "title" => "Italy",
                "lang" => "it_IT",
            ),
            "uk" => array(
                "title" => "United Kingdom",
                "lang" => "en_GB",
            )
        )   
    ),
    "Africa" => array(
        "locations" => array(
            "za" => array(
                "title" => "Südafrika",
                "lang" => "en_ZA",
            )
        )
    ),
    "Asia & Pacific" => array(
        "locations" => array(
            "au" => array(
                "title" => "Australia",
                "lang" => "en_AU",
            ),
            "cn" => array(
                "title" => "中国",
                "lang" => "zh_CN",
            ),
            "hk" => array(
                "title" => "香港",
                "lang" => "zh_CN",
            ),
            "jp" => array(
                "title" => "日本",
                "lang" => "jp_JP",
            ),
            "kr" => array(
                "title" => "한국",
                "lang" => "ko_KR",
            )
        )
    )
)

调用searchArray($siteOptions['locales'], 'us', 'lang')应返回'en_US'

3个回答

3
function walk($array, $key, $option) {
    if( !is_array( $array)) {
        return false;
    }
    foreach ($array as $k => $v) {
        if($k == $key && is_array($v) && isset($v[$option])){
            return $v[$option];
        }
        $data = walk($v, $key, $option);
        if($data != false){
            return $data;        
        }
    }

    return false;
}

echo walk($array, 'jp', 'lang');

我不得不在foreach循环中包装 if (is_array($array){} ,除此之外,完美无缺!非常感谢。 - StephenRios

2
function searchArray($arr, $key, $subkey) {
    $it = new RecursiveIteratorIterator(new RecursiveArrayIterator($arr), RecursiveIteratorIterator::SELF_FIRST);
    $found = false;
    foreach($it as $k => $v) {
        if ($k == $key && !$found) $found = true;
        elseif ($k == $subkey && $found) return $v;
    }
    return false;
}

尝试了这个,但$k从未返回我要查找的值,所以我无法搜索它。 - StephenRios
1
@StephenRios 在你发布数组示例之前,我已经写了原始版本。这个版本简短而有效。虽然我来晚了,没能得到勾选标记,但我想把它留在这里,供后代参考。哈哈 - keyboardSmasher
这个版本也可以运行,并且节省了几行代码。不错!现在如果我能理解它们是如何工作的就好了,哈哈。 - StephenRios

0

2
你比我快了10秒钟,哈哈。 - Zach Lysobey
1
我原本试图使用array_walk_recursive函数,但是当关联数组和索引数组混合在一起时,它无法正确返回值。 - StephenRios
你能发一个小的数组示例吗?听起来你想做的事情可以通过递归调用array_walk_recursive()来完成(即在你传递给array_walk_recursive()的可调用函数内部递归调用)。 - user428517
已添加示例数组。目前我正在这样调用我的函数:searchArray($siteOptions['locales'], 'us', 'lang'),它将查找“us”(或任何我提供的值),确保它是包含键为“'lang'”的值的数组,如果是,则返回“'lang'”。 - StephenRios

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接