2017-09-19 132 views
-2

次の配列をほぼフラットな配列に変更しようとしています。したがって、id 4は配列の最初のレベルにあります(id 6と5と同じですが、独自のインデックスを持ちますので、どのページがどのページであるかを知ることができます)。しかし、彼らは今と同じ順序で。私はその解決策が何らかの再帰的なPHP関数であると推測していますが、私はこれを行う方法を手がかりにしていません。PHP - (ほぼ)多次元配列を再帰的に平坦化

Array 
(
[0] => Array 
    (
     [id] => 2 
     [identifier] => External URL 
     [parent] => 0 
     [sortOrder] => 1 
     [depth] => 0 
    ) 

[1] => Array 
    (
     [id] => 3 
     [identifier] => First Team 
     [parent] => 0 
     [sortOrder] => 2 
     [depth] => 0 
     [children] => Array 
      (
       [0] => Array 
        (
         [id] => 4 
         [identifier] => League tables 
         [parent] => 3 
         [sortOrder] => 0 
         [depth] => 1 
         [children] => Array 
          (
           [0] => Array 
            (
             [id] => 6 
             [identifier] => British and Irish Cup Tables 
             [parent] => 4 
             [sortOrder] => 24 
             [depth] => 2 
            ) 

           [1] => Array 
            (
             [id] => 5 
             [identifier] => Greene King IPA Championship 
             [parent] => 4 
             [sortOrder] => 25 
             [depth] => 2 
            ) 

          ) 

        ) 

      ) 

    ) 

[2] => Array 
    (
     [id] => 1 
     [identifier] => Home 
     [parent] => 0 
     [sortOrder] => 25 
     [depth] => 0 
    ) 

) 
+1

[あなたは、あなたの質問のタイトルをGoogleにしましたか?](https://www.google.co.uk/search?q=Flatten+multidimensional+array+recursively+php&oq=Flatten+multidimensional+array+recursively+ php&gs_l = psy-ab.3 ... 2538.2982.0.4106.4.4.0.0.0.1.187.403.3j1.4.0 .... 0 ... 1.1.64.psy-ab..0.3.214 ... 33i22i29i30k1。 0.JegtayTjrNU) – Script47

+4

[PHPで多次元配列を単純化する方法](https://stackoverflow.com/questions/526556/how-to-flatten-a-multi-dimensional -Array-to-simple-one-in-php) – Script47

+0

残念ながら、この解決策は私の問題を解決しません。私は前にこのコードを試して、それは私に配列の最初のインデックスを示しています。 –

答えて

0
<?php 

$data = [ 
    [ 
     'id' => 1, 
     'name' => 'one', 
     'children' => 
     [ 
      [ 
       'id' => 2, 
       'name' => 'two', 
       'children' => 
       [ 
        [ 
         'id' => 4, 
         'name' => 'four' 
        ] 
       ] 
      ], 
      [ 
       'id' => 3, 
       'name' => 'three', 
       'children' => 
       [ 
        [ 
         'id' => 5, 
         'name' => 'five'       
        ] 
       ] 
      ] 
     ] 
    ], 
    [ 
     'id' => 6, 
     'name' => 'six' 
    ] 
]; 

$stanley = []; 
$flatten = function(array $data) use (&$flatten, &$stanley) { 
    foreach($data as $k => $v) { 
     if(isset($v['children'])) { 
      $flatten($v['children']); 
      unset($v['children']); 
     } 
     $stanley[] = $v; 
    } 
}; 

$flatten($data); 
var_export($stanley); 

出力:

array (
    0 => 
    array (
    'id' => 4, 
    'name' => 'four', 
), 
    1 => 
    array (
    'id' => 2, 
    'name' => 'two', 
), 
    2 => 
    array (
    'id' => 5, 
    'name' => 'five', 
), 
    3 => 
    array (
    'id' => 3, 
    'name' => 'three', 
), 
    4 => 
    array (
    'id' => 1, 
    'name' => 'one', 
), 
    5 => 
    array (
    'id' => 6, 
    'name' => 'six', 
), 
) 
0

私は解決策を見つけました!私は、配列のフラット(ish)を維持しながら各項目のレベルを追跡する深度インデックスを利用する再帰的なPHP関数を構築しました。

function dropdownNavigationTree($array) { 

$response = []; 

    foreach($array as $page) { 

     if (!is_array($page['children'])) { 

      $response[$page['id']] = ($page['depth'] > 0 ? str_repeat("-", $page['depth']).' ' : FALSE).$page['identifier']; 

     } else { 

      $response[$page['id']] = ($page['depth'] > 0 ? str_repeat("-", $page['depth']).' ' : FALSE).$page['identifier']; 
      $children = dropdownNavigationTree($page['children']); 

      $response = $response + $children; 

     } 

    } 

    return $response; 

}