2017-02-03 3 views
2

Я пытаюсь организовать массив в уровнях. Это мой массив:Упорядочить массив рекурсивно

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 
       ) 

     ) 

) 
+0

Можете ли вы найти нужный результат, что вам нужно –

+0

Пожалуйста, сообщите свой ожидаемый результат –

+0

@ KARTHISRV Я отредактировал сообщение с ожидаемым выходом. –

ответ

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 
       ) 
     ) 
) 
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; 
+1

@RyanVincent, KARTIS SRV благодарит человека, что вы прекрасны, отлично работайте! –