PHP-将水平添加到多维阵列中



我有一个多维数组,我想为多维数组中的每个数组添加一个键和值。该值必须是多维阵列内数组的深度的水平。

例如:

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
                                 )

您基本上想将递归函数与参考一起使用。

通过在其前面使用&的参数&$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);
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);

我不知道它是否相关,但是为什么不使用bluem/tree之类的库呢?
它具有用于此类问题的功能。

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

最新更新