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排序脚本。
当你和希拉一起工作时……希拉……类树数据将数据表示为树总是一个好主意。
下面的截图可用于将平面数组转换为树,现在可以通过递归处理给定元素的所有
该方法执行以下操作:
- 迭代所有元素,直到平面数组为空(它假定每个元素要么是根元素,要么在数组中有匹配的父元素)
- 如果是根元素,则将其添加到
result 根 - 如果匹配的父元素已经转移到
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 2 3 4 |
;函数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)); |