【问题标题】:retrieve multidiensional array keys without infinitely nested foreach在没有无限嵌套的 foreach 的情况下检索多维数组键
【发布时间】:2012-03-03 06:41:35
【问题描述】:

假设我有一个非常复杂的多维数组,如下所示:

Array
(
        [A] => Array
            (
                [B] => Array
                    (
                        [C] => Array
                            (
                                [D] => Array
                                    (
                                        [E] => Array
                                            (
                                                [0] => Array
                                                    (
                                                        [id] =>
                                                        [firstname] =>
                                                        [lastname] => 
                                                    )

                                            )

                                    )

                            )

                    )

            )

    )

在这个数组中,键的数量可以根据情况而有所不同,例如,键可以只有A、B和C,也可以只有A和B,甚至A、B、C、D、E, F、G、H、...等。是否可以在没有 20 个嵌套 foreach 循环的情况下收集此类数组的键(在本例中为内部键 A、B、C、D 和 E)?

谢谢

【问题讨论】:

  • 尝试递归!等一下,我会带来代码...

标签: php arrays multidimensional-array


【解决方案1】:

所以你想递归地枚举键?这是一个函数:

function enumerateKeys($array, &$keys) {
    if(!isset($keys)) {
        $keys = array();
    }

    foreach($array as $key => $value) {
        if(is_array($value)) {
            $keys[] = $key; /* Moved below if() to enumerate only array keys */
            enumerateKeys($value, $keys);
        }
    }
}

Here's a working demo.

【讨论】:

  • enumerateKeys($array, $keys);, 你的工作演示中定义的变量 $keys 在哪里?
  • @user765368:不是。我通过引用传递它,因此不必定义它(因此isset 签入enumerateKeys)。
  • 很好,但这也会返回更深层的非多维数组中的键。我只想要包含另一个数组(在我的情况下为 A、B、C、D、E)的数组的键
  • @user765368:好的,答案已编辑以反映该更改。 (移动了一行!:D)
  • 非常感谢您的帮助,但它缺少一件事,我希望在遇到第一个元素不是数组的数组时立即停止键搜索。换句话说,在我上面的例子中,我想停在键 E(所以我想要 A、B、C、D、E)。我会努力做出改变以反映我想要的
【解决方案2】:

这是一个不错的递归解决方案:

function getKeys($yourArray) {
  $allKeys = array();
  if(is_array($yourArray)) {
    foreach($yourArray as $key => $value) {
       $allKeys = array_push($allKeys,$key);
       $allKeys = array_merge($allKeys,getKeys($value));
    }
  } else {
    //this line will also add the values if you want them
    //if you only want keys then just leave it out
    $allKeys = array_push($allKeys,$yourArray);
  }
  return $allKeys;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-31
    • 2013-05-05
    • 2018-01-25
    • 2022-07-20
    • 2014-06-06
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多