2016-12-05 6 views
-1

I持っ配列、私は、別の項目に子供-ノードを 『カット』私にこれらの配列を与えることによって、 『フラット化』したい'、「untree」再帰的な配列を平らにINGの

$arr = Array(
    Array(
     'title' => 'Title 1', 
     'id' => 1, 
     'parent' => 0, 
     'children' => [ 
      Array(
       'title' => 'Title 1.1', 
       'id' => 4, 
       'parent' => 1, 
       'children' => [ 
        Array(
        'title' => 'Title 1.1.1', 
        'id' => 19, 
        'parent' => 4 
        ),  
        Array(
        'title' => 'Title 1.1.2', 
        'id' => 123, 
        'parent' => 4 
        ) 
       ] 
      ), 
      Array(
       'title' => 'Title 1.2', 
       'id' => 4, 
       'parent' => 1, 
       'children' => [ 
        Array(
        'title' => 'Title 1.2.1', 
        'id' => 19, 
        'parent' => 4 
        ) 
       ] 
      ) 
     ] 
    ), 
    Array(
     'title' => 'Title 2', 
     'id' => 1, 
     'parent' => 0 
    ) 
); 

1レベル配列のアイテム:

$arr = Array(
    Array(
     'title' => 'Title 1', 
     'id' => 1, 
     'parent' => 0 
    ), 
    Array(
     'title' => 'Title 1.1', 
     'id' => 4, 
     'parent' => 1 
    ), 
    Array(
     'title' => 'Title 1.1.1', 
     'id' => 19, 
     'parent' => 4 
    ), 
    Array(
     'title' => 'Title 1.1.2', 
     'id' => 123, 
     'parent' => 4 
    ),   
    Array(
     'title' => 'Title 1.2', 
     'id' => 4, 
     'parent' => 1 
    ), 
    Array(
     'title' => 'Title 1.2.1', 
     'id' => 19, 
     'parent' => 4 
    ), 
    Array(
     'title' => 'Title 2', 
     'id' => 1, 
     'parent' => 0 
    ) 
); 

ここで誰かを助けることができますか?どうもありがとう!

+0

関数traverseArray($配列、$ {($ value ['children'])){ foreach($ array as $ key =>&$ value){ if(isset($ value ['children'])){ return traverseArray($ value); } else { $ target [] = $ array; } } return $ target; } $ out = traverseArray($ arr); print_r($ out); これは繰り返しますが、パターンを残してしまいます。どのように構築されているのかは分かりません。 – chrney

答えて

1

これがお手伝いします。..

<?php 
function recursiveFind(array $items,&$return=array()) 
{ 
    foreach($items as $item){ 
     if(array_key_exists('children',$item)){ 
      $childs = $item['children']; 
      unset($item['children']); 
      array_push($return,$item); 
      recursiveFind($childs,$return); 

     }else{ 
      array_push($return,$item); 
     } 

    } 
    return $return; 
} 

$arr = Array(
    Array(
     'title' => 'Title 1', 
     'id' => 1, 
     'parent' => 0, 
     'children' => [ 
      Array(
       'title' => 'Title 1.1', 
       'id' => 4, 
       'parent' => 1, 
       'children' => [ 
        Array(
        'title' => 'Title 1.1.1', 
        'id' => 19, 
        'parent' => 4 
        ),  
        Array(
        'title' => 'Title 1.1.2', 
        'id' => 123, 
        'parent' => 4 
        ) 
       ] 
      ), 
      Array(
       'title' => 'Title 1.2', 
       'id' => 4, 
       'parent' => 1, 
       'children' => [ 
        Array(
        'title' => 'Title 1.2.1', 
        'id' => 19, 
        'parent' => 4 
        ) 
       ] 
      ) 
     ] 
    ), 
    Array(
     'title' => 'Title 2', 
     'id' => 1, 
     'parent' => 0 
    ) 
); 
echo '<pre>'; 
print_r(recursiveFind($arr)); 
+0

申し訳ありませんが、あなたは間違っていると思います。私は1レベル配列が必要です。私は自分の質問と予想される結果を編集しました。 – chrney

+0

@chrney、私は一度答えを更新しました。 –

+0

ありがとうございます。私たちは近づいていますが、まだありません - アレイが "驚くような"状態になっていれば残念ながらほとんど使用しません。提供されるのと同じ順序で、上から下に必要です。とにかくありがとう! – chrney

-1

3のforeachでこれを試してみてください:

foreachのを($編曲:$ Aなど) {

echo $a['title']; 
foreach($a['children'] as $b) 
{ 
    echo $b['title']; 
    foreach($b['children'] as $c) 
    { 
     echo $c['title']; 
    } 
} 

} 
+1

良い考えではありません。私はa)どのように深いこれが行くかもしれないかの手がかりがない。 b)どんなレベルであっても、同じことをするのが特に重要なので、コードを繰り返したくない。 – chrney

関連する問題