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

标签 php arrays loops multidimensional-array

我有一个多维数组,我不知道它的深度。例如,该数组可能如下所示:

$array = array(
    1 => array(
        5 => array(
            3 => 'testvalue1'
        )
    ),
    2 => array(
        6 => 'testvalue2'
    ),
    3 => 'testvalue3',
    4 => 'testvalue4',
);

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

PS:对于我的脚本,键是字符串(“1”而不是 1)还是整数并不重要,如果将字符串作为键将使 array_walk_recursive 保留它们。

最佳答案

您可以在堆栈的帮助下遍历数组以构建目录。

$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);

输出:

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
)

如果需要,您也可以额外处理关卡,但您的问题并不清楚。

array_walk_recursive 不起作用,因为它不会为您提供父元素的键。另请参阅此相关问题:Transparently flatten an array ,它有一个很好的答案,并且对更一般的情况也有帮助。

关于PHP 在保留键的同时遍历多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7854940/

相关文章:

php - 在 PHP 中跨页面 View 存储临时数据的最佳方法是什么?

javascript - 将代码从 JavaScript 转换为 PHP

python - reshape 数组时参数 (..., -1) 是什么意思?

python - Python - 合并两个字典列表,只返回第二个列表中的最后一个字典

php - Laravel AJAX POST 请求为空

php - 获取打开文档的总计(MySQL QUERY)

c++ - Qt 信号和槽发送结构数组

C# 如何查找并替换字符串中的特定文本?

python - 使用 python 将列表中的每个对象与同一列表中的所有其他对象进行一次测试

parsing - 创建Brainfuck解析器,解析循环运算符的最佳方法是什么?