【问题标题】:Finding the parent key of a key from an multi dimensional array in PHP [duplicate]从PHP中的多维数组中查找键的父键[重复]
【发布时间】:2021-07-02 00:33:25
【问题描述】:

我想在一个多维数组中找到第二个键的父键,像这样:

Array
(
    [REG-4] => Array
        (
            [9007] => MANADO
            [9012] => MAMBAL
            [9078] => SEMBUNG GEDE
            [90A8] => BANYUWANGI
        )

    [REG-2] => Array
        (
            [9009] => SUBANG
            [9013] => CITEUREUP
            [9014] => BABAKAN PARI
            [9017] => CIANJUR
            [9018] => CIHERANG
            [9052] => LEGOS
            [9076] => SENTUL
            [90A0] => CARINGIN
            [9101] => MEKARSARI
            [9103] => BEKASI
        )
)

我有这个代码来实现这样的东西 => recursion(array,9007) = REG-4

function recursion($array,$needle,$parent=null){
    foreach($array as $key => $value){
        if(is_array($value)){
            recursion($value,$needle,$parent=$key);
        }
        else if($key==$needle){
            return $parent;
        }
    }
}

但我的问题是返回不会停止递归。找到正确的父级后,该功能仍将继续。如果我的递归函数中有任何错误的逻辑,需要一些帮助。

最好的

【问题讨论】:

  • 如果数组只有两层,那为什么要使用递归呢?如果它可以有更多级别 - 那么请展示这种情况的适当示例。
  • 返回正确的结果吗?我认为递归调用应该有return recursion(...),而不仅仅是recursion(...)
  • @CBroe 我认为该数组将来可以有更多的深度,但为简单起见,我只使用了一个两级数组。
  • @mickadoo 是的,当我打印结果时,它恰好在“9007”处停止,但循环继续到下一个键(REG-2)

标签: php arrays recursion


【解决方案1】:

我认为,如果在找到结果后停止处理很重要,那么您可以通过几种方式这样做。您可以在函数内使用静态变量来跟踪是否找到了结果。或者您可以通过引用传递一个变量,这将达到相同的结果。

不过,您不需要使用其中任何一个,您只需在每次递归调用后检查它是否还没有找到结果。

function recursion($value, $needle, $key = null, $parent = null)
{
    printf('Checking %s with key "%s"'.PHP_EOL, gettype($value), $key);
    if (is_array($value)) {
        foreach ($value as $k => $child) {
            $result = recursion($child, $needle, $k, $key);
            if ($result) {
                return $result;
            }
        }
    }

    return $key == $needle ? $parent : null;
}

php index.php 9007 
Checking array with key ""
Checking array with key "REG-4"
Checking string with key "9007"
Got result REG-4

【讨论】:

  • 做得很好,经过解释和测试。
猜你喜欢
  • 1970-01-01
  • 2019-02-15
  • 2014-05-11
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多