2016-12-17 11 views
0

にフラットな家族のリストを変換するので、私は自分自身を構築します。PHPは、私がこのような状況のために検索してきたし、任意の解決策を見つけることができませんでした</p> <p>...この1つは少しQ & A-スタイルでツリー

は、それは私のニーズのための作業コードを取得するために数日かかったが、今は、より効率的な方法があるかどう疑問に思って:

Array 
(
[a] => Array 
    (
     [aa] => Array 
      (
       [aaa] => 
       [aab] => 
       [aac] => 
      ) 

     [ab] => 
     [ac] => Array 
      (
       [aca] => 
      ) 

    ) 

[b] => Array 
    (
     [ba] => 
     [bb] => 
     [bc] => 
    ) 

) 

:これが結果です

$data = [ 
    ['a','aa','aaa'], 
    ['a','aa','aab'], 
    ['a','aa','aac'], 
    ['a','ab'], 
    ['a','ac','aca'], 
    ['b','ba'], 
    ['b','bb'], 
    ['b','bc'], 
]; 


function tree($values){ 
    $on_end = sizeof($values) == 1 && sizeof($values[0]) == 0; 
    if ($on_end) return null; 

    $tree1 = []; 
    $tree2 = []; 

    foreach ($values as $a){ 
    $parent = $a[0]; 
    //remove the first column 
    array_shift($a); 
    $tree1[ $parent ][] = $a; 
    } 

    foreach ($tree1 as $parent => $b){ 
    $tree2[ $parent ] = tree($b); 

    } 

    return $tree2; 

} 


echo "<pre>".print_r(tree($data),true)."</pre>"; 

もし誰かがより良いものを手に入れたら、それを掲示してください!

答えて

1

あなたは、最短のソリューションを持っている...しかし、それはeval機能ERKコードの

<?php 

$data = [ 
    ['a','aa','aaa'], 
    ['a','aa','aab'], 
    ['a','aa','aac'], 
    ['a','ab'], 
    ['a','ac','aca'], 
    ['b','ba'], 
    ['b','bb'], 
    ['b','bc'], 
]; 

function arrayToTree_eval(array $source, $defaultValue = null) { 
    $tree = []; 

    foreach($source as $values) { 
     eval(sprintf('$tree%s = $defaultValue;', '["' . implode('"]["', $values) . '"]')); 
    } 

    return $tree; 
} 

var_dump(arrayToTree_eval($data)); 

7行を使用して、そしてホップです!

array (size=2) 
    'a' => 
    array (size=3) 
     'aa' => 
     array (size=3) 
      'aaa' => null 
      'aab' => null 
      'aac' => null 
     'ab' => null 
     'ac' => 
     array (size=1) 
      'aca' => null 
    'b' => 
    array (size=3) 
     'ba' => null 
     'bb' => null 
     'bc' => null 

:)

関連する問題

 関連する問題