【问题标题】:php convert flat family list to treephp将平面家庭列表转换为树
【发布时间】:2016-12-17 16:37:01
【问题描述】:

这个有点问答风格……

我一直在寻找这种情况,但找不到任何解决方案,所以我自己构建了。

我花了几天的时间才得到满足我需要的工作代码,但现在我想知道是否有更有效的方法:

$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>";

这是结果:

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

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

    )

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

)

如果有人有更好的,请发布!

【问题讨论】:

    标签: php arrays tree


    【解决方案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
    

    :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 2018-09-08
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多