【问题标题】:Sorting array depending on parent; a tree in a one-dimensional array根据父级排序数组;一维数组中的树
【发布时间】:2012-08-31 10:49:57
【问题描述】:

如何将所有孩子的数组排在他们各自的父母之后?我想我正在尝试将一棵树存储在一维数组中。我尝试使用 usort 来解决这个问题,但我认为它不是适合这项工作的工具。

示例输入数组:

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', ))

示例输出:

【问题讨论】:

  • 这个数组会有多少层?
  • 我不明白你在问什么。我们到底想在这里实现什么?将父编号与 id 匹配?

标签: php arrays sorting tree


【解决方案1】:

首先构建一棵实际的树,然后将该树展平:

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

【讨论】:

    【解决方案2】:
    <?php
    
    /**
     * @author Prasath A.R
     * @copyright 2012
     * @Date 2012-8-31 17:14
     */
    
    $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', ));
    
    print_r($array);
    echo "<br />";
    
    for($i=0;$i<count($array);$i++)
    {
    for($j=$i;$j<count($array);$j++)
    {
            if($array[$i]['parent']>$array[$j]['parent'])
            {
                $temp=$array[$i];
                $array[$i]=$array[$j];
                $array[$j]=$temp;
            }
        }
    }
    
    echo "<h2>After Sorting</h2><br />";
    print_r($array);
    
    ?>
    

    答案是:

    数组 ( [0] => 数组 ( [id] => 1 [父] => 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
        )
    

    )

    排序后

    数组 ( [0] => 数组 ( [id] => 1 [父] => 0 )

    [1] => Array
        (
            [id] => 3
            [parent] => 0
        )
    
    [2] => Array
        (
            [id] => 5
            [parent] => 0
        )
    
    [3] => Array
        (
            [id] => 2
            [parent] => 1
        )
    
    [4] => Array
        (
            [id] => 31
            [parent] => 2
        )
    
    [5] => Array
        (
            [id] => 32
            [parent] => 2
        )
    
    [6] => Array
        (
            [id] => 17
            [parent] => 3
        )
    

    )

    【讨论】:

    • 这与问题不符。您的结果数组不等于问题中的数组。
    • @Emil Vikström :实际上结果匹配,我们需要将 0 键数组移动到数组的最后一个元素
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多