PHP - 将级别添加到多维数组

时间:2018-04-03 08:41:27

标签: php arrays recursion multidimensional-array

我有一个多维数组,我想为多维数组中的每个数组添加一个键和值。该值必须是数组在多维数组中的深度级别。

例如:

Array(
    [0] Array
        (
            [id] 1
            [parentid] null
            [0] Array
                (
                    [id] 101
                    [parentid] 1
    [1] Array
        (
            [id] 2
            [parentid] null
            [0] Array
                (
                    [id] 161
                    [parentid] 2
                    [children] Array
                        (
                            [0] Array
                                (
                                    [id] 300
                                    [parentid] 161
                                 )

预期产出:

Array(
    [0] Array
        (
            [id] 1
            [parentid] null
            [level] 1
            [0] Array
                (
                    [id] 101
                    [parentid] 1
                    [level] 2
    [1] Array
        (
            [id] 2
            [parentid] null
            [level] 1
            [0] Array
                (
                    [id] 161
                    [parentid] 2
                    [level] 2
                    [children] Array
                        (
                            [0] Array
                                (
                                    [id] 300
                                    [parentid] 161
                                    [level] 3
                                 )

3 个答案:

答案 0 :(得分:2)

你基本上想要使用一个与reference一起使用的递归函数。

通过使用前面带有&$foo的参数&,您可以将其指定为该对象的引用。

对于数组,它不会复制修改,而是对原始传递的数组执行修改。

编辑在评论中添加了Yoshi的建议,以便将&value作为参考。

现场直播:https://ideone.com/NhKABF

<?php
$array = [
    'hello' => 'world',
    'doing' => [
        'hello' => 'universe',
        'going' => [
            'hello' => 'existence'
         ],
        'moving' => [
            'answer' => 42,
        ]
    ]
];
function levelUp(&$array, $level = 1) 
//               ^-- See that one? that's the  magic.
{
    $array['level'] = $level;

    foreach($array as $key => &$value) {
    //                        ^-- important to add that & here too
        if(is_array($value)) {
            levelUp($value, $level + 1);
        }
    }
}
levelUp($array);
var_dump($array);

答案 1 :(得分:1)

function buildTree(array $elements, $parentId = 0) {
$branch = array();

foreach ($elements as $element) {
    if ($element['parent_id'] == $parentId) {
        $children = buildTree($elements, $element['id']);
        if ($children) {
            $element['children'] = $children;
        }
        $branch[] = $element;
    }
}

return $branch;

}

$tree = buildTree($rows);

答案 2 :(得分:0)

我不知道它是否相关,但为什么不使用像BlueM/Tree这样的库?
它具有针对此类问题而构建的功能。

// Get a node's ID
$id = $node->getId();

// Get the node's hierarchical level (1-based)
$level = $node->getLevel();