【问题标题】:How to set value in nested array PHP如何在嵌套数组 PHP 中设置值
【发布时间】:2021-04-08 13:00:37
【问题描述】:

我想将level 设置为嵌套数组中具有children 键的每个数组。该数组越深,级别值越大。

这是我的预期:

<?php
$array = array(
    array(
        'id' => 1,
        'children' => array(
            array(
                'id' => 6,
                'children' => array(
                    array(
                        'id' => 7,
                    ),
                    array(
                        'id' => 8,
                    )
                ),
                // Expected
                'level' => '2',
            ),
            array(
                'id' => 9,
            )
        ),
        // Expected
        'level' => '1'
    ),
    array(
        'id' => 2,
        'children' => array(
            array(
                'id' => 10,
            ),
            array(
                'id' => 13,
                'children' => array(
                    array(
                        'id' => 14,
                    ),
                    array(
                        'id' => 19,
                        'children' => array(
                          array(
                              'id' => 20,
                          ),
                          array(
                              'id' => 21,
                          ),
                          array(
                              'id' => 22,
                          ),
                          array(
                              'id' => 23,
                          ),
                        )
                        // Expected
                        'level' => '3'
                    )
                ),
                // Expected
                'level' => '2'
            ),
        ),
        // Expected
        'level' => '1'
    )
);

到目前为止,我创建了一个函数来设置嵌套数组中具有children 键的级别。但是,结果不是我所期望的。

<?php
$array = array(
    array(
        'id' => 1,
        'children' => array(
            array(
                'id' => 6,
                'children' => array(
                    array(
                        'id' => 7,
                    ),
                    array(
                        'id' => 8,
                    )
                ),
                // Expected
                // 'level' => '2',
            ),
            array(
                'id' => 9,
            )
        ),
        // Expected
        // 'level' => '1'
    ),
    array(
        'id' => 2,
        'children' => array(
            array(
                'id' => 10,
            ),
            array(
                'id' => 13,
                'children' => array(
                    array(
                        'id' => 14,
                    ),
                    array(
                        'id' => 19,
                        'children' => array(
                          array(
                              'id' => 20,
                          ),
                          array(
                              'id' => 21,
                          ),
                          array(
                              'id' => 22,
                          ),
                          array(
                              'id' => 23,
                          ),
                        )
                        // Reality result
                        // 'level' => '4'
                    )
                ),
                // Reality result
                // 'level' => '3'
            ),
        ),
        // Reality result
        // 'level' => '2'
    )
);

正如您在现实结果中看到的评论是2级,3级和4级。我期望的结果是1级,2级,3级,级别(n+ 1)。当更深的数组中没有任何子级时,必须将级别值重置为级别 1。

这是我得到实际结果的代码:

<?php
function updateTreeArray(&$array, $level = 1) {
    foreach ($array as $key => &$value) {
        if (isset($value['children'])) {
            $value['level'] = $level;
            $level = setLevel($value['children'], $level);
        }
        
        if (is_array($value)) {
            updateTreeArray($value, $level);
        }
    }

    return $array;
}

function setLevel($array, $level) {
    foreach ($array as $key => &$value) {
      if (isset($value['children'])) {
        $level += 1;
        setLevel($value['children'], $level);
      }
    }
  
  return $level;
}
  
print_r(updateTreeArray($array));

您能帮我做些什么来达到预期的效果吗?谢谢。

【问题讨论】:

  • TL;DR 恕我直言,在您的 setLevel() 函数中,您缺少类似 $array['level']=$level; 的内容

标签: php arrays multidimensional-array tree nested


【解决方案1】:

一个递归函数就足够了。

function updateTreeArray(&$array, $level = 1)
{
    foreach($array as &$item) {
        if (array_key_exists('children', $item) && is_array($item['children'])) {
            $item['level'] = $level;
            updateTreeArray($item['children'], $level + 1);
        }
    }
}

updateTreeArray($array);

print_r($array);

fiddle

【讨论】:

  • 这个答案缺少教育解释。
  • 感谢@ser14717238!它有效并且非常感谢。我不明白的另一件事是,在使用'id' =&gt; 2 移动到数组后,$level 如何再次重置为 1
  • 这是一种递归调用技术。循环的每次迭代中的函数调用等待其结果并记住该调用级别的所有变量值。等等每个嵌套调用。因此,对于太大的调用深度,可能内存不足。 How Recursion Works Inside a For Loop
  • 注明。再次感谢@user14717238
猜你喜欢
  • 2020-11-08
  • 2013-03-24
  • 2017-09-30
  • 2012-11-26
  • 2021-10-17
  • 2012-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多