doujiao3998 2012-08-31 10:49
浏览 26
已采纳

根据父级排序数组; 一维数组中的树

How can I sort an array with all children after their respective parents? I guess I'm trying to store a tree inside a one-dimensional array. I have tried to figure this out using usort, but I don't think it is the right tool for the job.

Example input array:

array (0 => array ( 'id' => '1', 'parent' => '0', ), 
1 => array ( 'id' => '2', 'parent' => '1', ), 
2 => array ( 'id' => '3', 'parent' => '0', ), 
3 => array ( 'id' => '5', 'parent' => '0', ), 
4 => array ( 'id' => '17', 'parent' => '3', ), 
5 => array ( 'id' => '31', 'parent' => '2', ), 
6 => array ( 'id' => '32', 'parent' => '2', ))

Example output:

Array sorted according to the description

  • 写回答

2条回答 默认 最新

  • dra11767 2012-08-31 10:53
    关注

    Start by building an actual tree, then flatten that tree:

    $array = array (0 => array ( 'id' => '1', 'parent' => '0', ),
                    1 => array ( 'id' => '2', 'parent' => '1', ),
                    2 => array ( 'id' => '3', 'parent' => '0', ),
                    3 => array ( 'id' => '5', 'parent' => '0', ),
                    4 => array ( 'id' => '17', 'parent' => '3', ),
                    5 => array ( 'id' => '31', 'parent' => '2', ),
                    6 => array ( 'id' => '32', 'parent' => '2', ));
    
    /* Building a tree. We also save a map of references to avoid                                
       searching the tree for nodes */
    
    //Helper to create nodes                                                                     
    $tree_node = function($id, $parent) {
      return array('id' => $id, 'parent' => $parent, 'children' => array());
    };
    
    $tree = $tree_node(0, null); //root node                                                     
    $map = array(0 => &$tree);
    foreach($array as $cur) {
      $id = (int) $cur['id'];
      $parentId = (int) $cur['parent'];
      $map[$id] =& $map[$parentId]['children'][];
      $map[$id] = $tree_node($id, $parentId);
    }
    
    //Now recursively flatten the tree:                                                          
    function flatter($node) {
      //Create an array element of the node                                            
      $array_element = array('id' => (string) $node['id'],
                             'parent' => (string) $node['parent']);
      //Add all children after me                                                                
      $result = array($array_element);
      foreach($node['children'] as $child) {
        $result = array_merge($result, flatter($child));
      }
      return $result;
    }
    
    $array = flatter($tree);
    array_shift($array); //Remove the root node, which was only added as a helper                
    
    print_r($array);
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥30 自适应 LMS 算法实现 FIR 最佳维纳滤波器matlab方案
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥15 Python3.5 相关代码写作
  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像