PHP按ID和父ID排序数组

PHP Sorting array by id and parent id

本问题已经有最佳答案,请猛点这里访问。

我找了很多这个问题:

我有一个阵列:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
array(
  array('id' = '1'; 'parent' = '0'; 'title' = 'XXX1');
  array('id' = '85'; 'parent' = '0'; 'title' = 'XXX2');
  array('id' = '41'; 'parent' = '0'; 'title' = 'XXX2');
  array('id' = '17'; 'parent' = '0'; 'title' = 'XXX3');
  array('id' = '66'; 'parent' = '1'; 'title' = 'XXX4');
  array('id' = '92'; 'parent' = '1'; 'title' = 'XXX5');
  array('id' = '65'; 'parent' = '1'; 'title' = 'XXX6');
  array('id' = '45'; 'parent' = '41'; 'title' = 'XXX7');
  array('id' = '19'; 'parent' = '92'; 'title' = 'XXX8');
  array('id' = '101'; 'parent' = '45'; 'title' = 'XXX9');
  array('id' = '102'; 'parent' = '45'; 'title' = 'XXX10');
  array('id' = '103'; 'parent' = '19'; 'title' = 'XXX11');
  array('id' = '104'; 'parent' = '19'; 'title' = 'XXX12');
  array('id' = '105'; 'parent' = '19'; 'title' = 'XXX13');
);

我该如何分类:

  • 它按id if parent == 0排序,但如果它有子代,它们应该紧跟在它们的父代之后。如果那个孩子有了孩子,他们也应该在父母之后。

  • 考虑到where parent = 0项是0级,并且此ID的每个子项都有1级等。

  • 现在:If level = 0应该在标题前加"-title"。如果级别是2-"标题",如果级别是5-"标题"

我有大约300张唱片,最高4级。我不需要为级别<5排序脚本,但也需要为级别100排序脚本。


当你和希拉一起工作时……希拉……类树数据将数据表示为树总是一个好主意。

下面的截图可用于将平面数组转换为树,现在可以通过递归处理给定元素的所有children数组来轻松处理。

该方法执行以下操作:

  • 迭代所有元素,直到平面数组为空(它假定每个元素要么是根元素,要么在数组中有匹配的父元素)
  • 如果是根元素,则将其添加到result
  • 如果匹配的父元素已经转移到result数组中,则将该元素作为子元素添加。

我使用了第二个数组$refs,它只包含基于每个元素ID的引用,因为它允许在$result数组的任何级别插入元素,而不必搜索正确的级别。

附:可能有一些更容易理解的递归方法。

pps.:我向任何元素添加了一个空的子数组,这样在插入子数组时就不必处理不存在的数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$arr = array(
  array('id' => 1, 'parent' => 0, 'title' => 'XXX1', 'children'=>array()),
  array('id' => 85, 'parent' => 0, 'title' => 'XXX2', 'children'=>array()),
  array('id' => 41, 'parent' => 0, 'title' => 'XXX2', 'children'=>array()),
  array('id' => 17, 'parent' => 0, 'title' => 'XXX3', 'children'=>array()),
  array('id' => 66, 'parent' => 1, 'title' => 'XXX4', 'children'=>array()),
  array('id' => 92, 'parent' => 1, 'title' => 'XXX5', 'children'=>array()),
  array('id' => 65, 'parent' => 1, 'title' => 'XXX6', 'children'=>array()),
  array('id' => 45, 'parent' => 41, 'title' => 'XXX7', 'children'=>array()),
  array('id' => 19, 'parent' => 92, 'title' => 'XXX8', 'children'=>array()),
  array('id' => 101, 'parent' => 45, 'title' => 'XXX9', 'children'=>array()),
  array('id' => 102, 'parent' => 45, 'title' => 'XXX10', 'children'=>array()),
  array('id' => 103, 'parent' => 19, 'title' => 'XXX11', 'children'=>array()),
  array('id' => 104, 'parent' => 19, 'title' => 'XXX12', 'children'=>array()),
  array('id' => 105, 'parent' => 19, 'title' => 'XXX13', 'children'=>array())
);

$newArr = unflattenArray($arr);

echo"[cc lang="php"]";
print_r($newArr);
echo"

;函数unfrattenarray($flattarray){$refs=array();//用于设置子级而不必在结果树中搜索父级。$result=array();//处理所有元素,直到解决nohting。//然后将剩余的元素逐个添加到根目录中。而(count($flatarray)>0){对于($i=count($flatarray)-1;$i>=0;$i--){如果($flatArray[$i]["父"]==0){//根元素:在result和ref中设置!$result[$flatarray[$i]["id"]=$flatarray[$i];$refs[$flatarray[$i]["id"]=&;$result[$flatarray[$i]["id"]];取消设置($flatarray[$i]);$flatarray=数组值($flatarray);}否则,如果($flatarray[$i]["parent"]!= 0){//没有根元素。推送到被引用的父级,并添加到引用。如果(array_key_exists($flatarray[$i]["parent"],$refs))。{/父母发现$O=$FlatArray[$I];$refs[$flatarray[$i]["id"]=$o;$refs[$flatarray[$i]["parent"]["children"]]=&;$refs[$flatarray[$i]["id"]];取消设置($flatarray[$i]);$flatarray=数组值($flatarray);}}}}返回结果;}< /代码>

此方法将返回一个结果,如(outtake):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[1] => Array
        (
            [id] => 1
            [parent] => 0
            [title] => XXX1
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 65
                            [parent] => 1
                            [title] => XXX6
                            [children] => Array
                                (
                                )

                        )

                    [1] => Array
                        (
                            [id] => 92
                            [parent] => 1
                            [title] => XXX5
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 19
                                            [parent] => 92

它仍然没有排序,但现在的格式可以很容易地处理。

例如,要对所有内容进行排序,现在可以简单地使用递归排序方法,如

1
2
3
4
sortMyArrays($newArr);
echo"[cc lang="php"]";
print_r($newArr);
echo"

;函数SortMyArrays(&;$arr){UASORT($arr,"SRT");foreach($arr为$a){SortMyArrays($A["children"]);}}功能SRT($A,$B){返回$A["id"]-$B["id"];}< /代码>

当然,同样的逻辑也可以用来操作标题、显示数据等。


这里的问题是,您有一个一维数组试图做一些实际上应该显示在树中的事情。这意味着,当您的孩子链接到家长时,家长应该知道自己的孩子是谁,但在这种情况下,他们不知道。因此,您可以将它放入一个新的数据结构中,或者构建一个递归函数来计算每个数据结构的父级。

这是通过首先按全局ID排序来完成的。这将确保我们不需要进行任何其他排序,因为数组已经按照您想要的顺序排列(在每个级别)。然后我们只需依次获取每个级别,递归地查找该级别的项并将它们附加到列表中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php

$dudzio = array(
  array('id' => 1, 'parent' => 0, 'title' => 'XXX1'),
  array('id' => 85, 'parent' => 0, 'title' => 'XXX2'),
  array('id' => 41, 'parent' => 0, 'title' => 'XXX2'),
  array('id' => 17, 'parent' => 0, 'title' => 'XXX3'),
  array('id' => 66, 'parent' => 1, 'title' => 'XXX4'),
  array('id' => 92, 'parent' => 1, 'title' => 'XXX5'),
  array('id' => 65, 'parent' => 1, 'title' => 'XXX6'),
  array('id' => 45, 'parent' => 41, 'title' => 'XXX7'),
  array('id' => 19, 'parent' => 92, 'title' => 'XXX8'),
  array('id' => 101, 'parent' => 45, 'title' => 'XXX9'),
  array('id' => 102, 'parent' => 45, 'title' => 'XXX10'),
  array('id' => 103, 'parent' => 19, 'title' => 'XXX11'),
  array('id' => 104, 'parent' => 19, 'title' => 'XXX12'),
  array('id' => 105, 'parent' => 19, 'title' => 'XXX13')
);

function sortDudzio($a, $b)
{
    // If you need to switch which way the values are sorted
    // switch the 1 and -1 around
    if($a['id'] > $b['id']) {
        return 1;
    } elseif($a['id'] < $b['id']) {
        return -1;
    } else {
        return 0;
    }
}

function getByParent($array, $id, $level)
{

    $orderedArray = array();

    foreach($array as $k=>$arr) {
        if($arr['parent'] == $id) {
            $arr['title'] = str_repeat('-', $level) . $arr['title'];
            $orderedArray[] = $arr;
            $children = getByParent($array, $arr['id'], $level + 1);
            foreach($children as $child) {
                $orderedArray[] = $child;
            }
        }
    }

    return $orderedArray;

}

usort($dudzio, 'sortDudzio');

print_r(getByParent($dudzio, 0, 0));