递归排列数组

时间:2017-02-03 08:03:17

标签: php arrays recursion

我正在尝试在关卡中排列数组。这是我的阵列:

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
                )

        )

)

2 个答案:

答案 0 :(得分:3)

另一个递归树步行。

我首先扫描树的'深度',所以我需要跟踪当前的'水平'。

Demonstration at 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
                )
        )
)

答案 1 :(得分:2)

如果您想要的输出是

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'];
}

根据您所需的输出

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

OUTPUT

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