PHP在保留键的同时遍历多维数组

car*_*rlo 1 php arrays loops multidimensional-array

我有一个多维数组,其中我无法知道深度.例如,数组可能如下所示:

$array = array(
    1 => array(
        5 => array(
            3 => 'testvalue1'
        )
    ),
    2 => array(
        6 => 'testvalue2'
    ),
    3 => 'testvalue3',
    4 => 'testvalue4',
);
Run Code Online (Sandbox Code Playgroud)

有了这个数组,我想创建一个目录.这意味着需要保留密钥,因为我将它们用作"章节编号".例如,"testvalue1"在第1.5.3章中.
现在我想在保留所有键的同时遍历数组 - 不使用array_walk_recursive,因为包含另一个数组的键被删除(正确?),并且考虑到速度,最好不使用嵌套的foreach循环.
有什么建议我应该怎么做?提前致谢.

PS:对于我的脚本,如果键是字符串("1"而不是1)或整数,则无关紧要,如果将字符串作为键将使array_walk_recursive保留它们.

hak*_*kre 8

您可以借助堆栈迭代数组来构建您的toc.

$stack = &$array;
$separator = '.';
$toc = array();

while ($stack) {
    list($key, $value) = each($stack);
    unset($stack[$key]);
    if (is_array($value)) {
        $build = array($key => ''); # numbering without a title.
        foreach ($value as $subKey => $node)
            $build[$key . $separator . $subKey] = $node;
        $stack = $build + $stack;
        continue;
    }
    $toc[$key] = $key. ' ' . $value;
}

print_r($toc);
Run Code Online (Sandbox Code Playgroud)

输出:

Array
(
    [1] => 1
    [1.5] => 1.5
    [1.5.3] => 1.5.3 testvalue1
    [2] => 2
    [2.6] => 2.6 testvalue2
    [3] => 3 testvalue3
    [4] => 4 testvalue4
)
Run Code Online (Sandbox Code Playgroud)

如果需要,您还可以另外处理级别,但是您的问题并不清楚.

array_walk_recursive不起作用,因为它不会给你父元素的键.请参阅此相关问题:透明地展平数组,它有一个很好的答案,也有助于更通用的情况.