递归排列数组



我正在尝试按级别排列数组。这是我的数组:

Array
  (
    [0] => Array(
      [0] => Array(
        [id] => 971249312[name] => Wolverine
      )
      [children] => Array(
        [0] => Array(
          [0] => Array(
            [id] => 735327624[name] => Ciclop
          )
          [children] => Array()
        )
      )
    )
    [1] => Array(
      [0] => Array(
        [id] => 1926833684[name] => Gambit
      )
      [children] => Array()
    )
    [2] => Array(
      [0] => Array(
        [id] => 51194629[name] => Quicksilver
      )
      [children] => Array()
    )
  )

看到数组的第一个位置有 3 个元素 - 这必须是级别 0。这些元素的第一个位置必须是级别 1。这些元素的子元素是下一个级别,依此类推。我不知道如何安排它。

预期输出:

Array
(
    ["level_1"] => Array
        (
            [0] => Array
                (
                    [id] => 971249312
                    [name] => Wolverine
                )
            [1] => Array
                (
                    [id] => 1926833684
                    [name] => Gambit
                )
            [2] => Array
                (
                    [id] => 51194629
                    [name] => Quicksilver
                )
        )
    ["level_2"] => Array
        (
            [0] => Array
                (
                    [id] => 735327624
                    [name] => Ciclop
                )
        )
)

另一个递归树步道。

我"首先扫描树的深度",所以我需要跟踪当前的"级别"。

eval.in 的演示

树扫描例程:

/**
 * Recursive scan of the tree
 * 
 * @node   array    Current Node to be processed
 * @level  integer  Current depth of the tree
 * output  array    reference to where to store the details
 *   
 * @return void
 */   
function scanNode($node, $level, &$output)
{
    $outLevelIdx = 'level_'. $level; 
    foreach ($node as $idx => $info) {
        $parent = current($info); 
        $output[$outLevelIdx][] = array('id' => $parent['id'], 'name' => $parent['name']);
        if (!empty($info['children'])) { // go scan the children
            scanNode($info['children'], $level + 1, $output);
        }        
    }  
}  

运行扫描:

/*
 *  Output array in here - pass as a reference 
 */  
$output = array();
// scan the full tree
scanNode($source, 0, $output);

示例输出:

output
Array
(
    [level_0] => Array
        (
            [0] => Array
                (
                    [id] => 971249312
                    [name] => Wolverine
                )
            [1] => Array
                (
                    [id] => 1926833684
                    [name] => Gambit
                )
            [2] => Array
                (
                    [id] => 51194629
                    [name] => Quicksilver
                )
        )
    [level_1] => Array
        (
            [0] => Array
                (
                    [id] => 735327624
                    [name] => Ciclop
                )
        )
)

如果你想要的输出是

Array
(
    [0] => Array
        (
            [id] => 971249312
            [name] => Wolverine
            [children] => Array
                (
                )
        )
    [1] => Array
        (
            [id] => 971249312
            [name] => Wolverine
            [children] => Array
                (
                )
        )
    [2] => Array
        (
            [id] => 971249312
            [name] => Wolverine
            [children] => Array
                (
                )
        )
)

那么你的代码应该是

$newArray = [];
foreach ($givenArray as $key => $value) {
    $newArray[$key]['id'] = $value[0]['id'];
    $newArray[$key]['name'] = $value[0]['name'];
    $newArray[$key]['children'] = $value['children'];
}

根据您想要的输出

此功能用于扫描所有节点并根据您的要求提供。

输出

$newArray = [];
myfunction($a, 0,$newArray);

function myfunction($loop, $level, &$newArray) {
    $index = "level_".$level;
    $i = 0;
    foreach ($loop as $key => $value) {
        foreach ($value as $key1 => $value1) {
            if($key1 !== 'children'){
                $newArray[$index][$i] = ['id' => $value1['id'], 'name' => $value1['name']];
                $i++;
            }
        }
        if (isset($value['children']) && !empty($value['children'])) { 
            myfunction($value['children'], $level + 1, $newArray);
        }
    }
}
print_r($newArray);exit;

最新更新