2017-02-03 19 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つの要素を持っていることを参照してください - これは、これらの要素の最初の位置は、これらの要素の1子であるレベルでなければならないレベル0でなければなりません。次のレベルのように。 私はそれを整理する方法を理解できません。

予想される出力:

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 
       (
       ) 

     ) 

) 

されている場合、あなたのコードは、ご希望の出力

あたりAS

$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ありがとう、大丈夫です、うまく動作します! –