PHP按id和父id排序数组
为了这个问题,我搜索了很多: 我有一个数组:PHP按id和父id排序数组,php,arrays,sorting,parentid,Php,Arrays,Sorting,Parentid,为了这个问题,我搜索了很多: 我有一个数组: 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(
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');
);
我如何将其排序为:
- 如果父项==0,则按ID
排序,但如果有子项,则应紧跟在父项之后。如果孩子有了孩子,他们也应该紧跟在父母之后
- 考虑父项=0的项目
是级别0,并且此id的每个子项都有级别1等
- 现在:
如果级别=0,则应在标题前添加“-TITLE”。如果级别为2-“--TITLE”,如果级别为5-“--TITLE”
我有大约300张唱片,最高级别约为4。对于<5级,我不需要排序脚本,但是对于100级,我也需要排序脚本。您这里的问题是,您有一个一维数组,它试图执行一些实际上要在树中显示的操作。这意味着,当您的孩子链接到家长时,家长应该知道自己的孩子是谁,但在这种情况下,他们不知道。因此,您可以将其放入一个新的数据结构中,或者构建一个递归函数来计算每种结构的父级 这是通过首先按ID全局排序来完成的。这将确保我们不需要进行任何其他排序,因为数组已经按照您想要的顺序(在每个级别)进行排序。然后,我们简单地依次获取每个级别,递归地查找该级别的项目并将其附加到列表中:
<?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));
您这里的问题是,您有一个一维数组试图执行一些实际上要显示在树中的操作。这意味着,当您的孩子链接到家长时,家长应该知道自己的孩子是谁,但在这种情况下,他们不知道。因此,您可以将其放入一个新的数据结构中,或者构建一个递归函数来计算每种结构的父级
这是通过首先按ID全局排序来完成的。这将确保我们不需要进行任何其他排序,因为数组已经按照您想要的顺序(在每个级别)进行排序。然后,我们简单地依次获取每个级别,递归地查找该级别的项目并将其附加到列表中:
<?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));
当您与hira…heira一起工作时。。。树状数据将数据表示为树总是一个好主意
下面的片段可以用于将平面数组转换为树,现在可以通过递归处理给定元素的所有子数组来轻松处理树
该方法执行以下操作:
- 迭代所有元素,直到平面数组为空(它假定每个元素都是根元素或在数组中有匹配的父元素)
- 如果是根元素,则将其添加到
结果
根
- 如果匹配的父元素已被传输到
结果
数组,请将该元素作为子元素添加
我使用了第二个数组$refs
,它只包含基于id的每个元素的引用,因为它允许在$result
数组的任何级别插入元素,而无需搜索正确的级别
注:可能存在更容易理解的递归方法
pps.:我向任何元素添加了一个空的子数组,这样在插入子数组时就不必处理不存在的数组
<?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 "<pre>";
print_r($newArr);
echo "</pre>";
function unflattenArray($flatArray){
$refs = array(); //for setting children without having to search the parents in the result tree.
$result = array();
//process all elements until nohting could be resolved.
//then add remaining elements to the root one by one.
while(count($flatArray) > 0){
for ($i=count($flatArray)-1; $i>=0; $i--){
if ($flatArray[$i]["parent"]==0){
//root element: set in result and ref!
$result[$flatArray[$i]["id"]] = $flatArray[$i];
$refs[$flatArray[$i]["id"]] = &$result[$flatArray[$i]["id"]];
unset($flatArray[$i]);
$flatArray = array_values($flatArray);
}
else if ($flatArray[$i]["parent"] != 0){
//no root element. Push to the referenced parent, and add to references as well.
if (array_key_exists($flatArray[$i]["parent"], $refs)){
//parent found
$o = $flatArray[$i];
$refs[$flatArray[$i]["id"]] = $o;
$refs[$flatArray[$i]["parent"]]["children"][] = &$refs[$flatArray[$i]["id"]];
unset($flatArray[$i]);
$flatArray = array_values($flatArray);
}
}
}
}
return $result;
}
它仍然未分类,但现在的格式可以轻松处理
例如,要对所有内容进行排序,现在可以简单地使用递归排序方法,如
sortmyarray($newArr);
回声“;
印刷费($newArr);
回声“;
函数排序数组(&$arr){
uasort($arr,“srt”);
foreach($arr作为$a){
Sortmyarray($a[“儿童]);
}
}
功能srt($a$b){
返回$a[“id”]-$b[“id”];
}
当然,同样的逻辑也可以用于操纵标题、显示数据等。当您使用hira…heira。。。树状数据将数据表示为树总是一个好主意
下面的片段可以用于将平面数组转换为树,现在可以通过递归处理给定元素的所有子数组来轻松处理树
该方法执行以下操作:
- 迭代所有元素,直到平面数组为空(它假定每个元素都是根元素或在数组中有匹配的父元素)
- 如果是根元素,则将其添加到
结果
根
- 如果匹配的父元素已被传输到
结果
数组,请将该元素作为子元素添加
我使用了第二个数组$refs
,它只包含基于id的每个元素的引用,因为它允许在$result
数组的任何级别插入元素,而无需搜索正确的级别
注:可能存在更容易理解的递归方法
pps.:我向任何元素添加了一个空的子数组,这样在插入子数组时就不必处理不存在的数组
<?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 "<pre>";
print_r($newArr);
echo "</pre>";
function unflattenArray($flatArray){
$refs = array(); //for setting children without having to search the parents in the result tree.
$result = array();
//process all elements until nohting could be resolved.
//then add remaining elements to the root one by one.
while(count($flatArray) > 0){
for ($i=count($flatArray)-1; $i>=0; $i--){
if ($flatArray[$i]["parent"]==0){
//root element: set in result and ref!
$result[$flatArray[$i]["id"]] = $flatArray[$i];
$refs[$flatArray[$i]["id"]] = &$result[$flatArray[$i]["id"]];
unset($flatArray[$i]);
$flatArray = array_values($flatArray);
}
else if ($flatArray[$i]["parent"] != 0){
//no root element. Push to the referenced parent, and add to references as well.
if (array_key_exists($flatArray[$i]["parent"], $refs)){
//parent found
$o = $flatArray[$i];
$refs[$flatArray[$i]["id"]] = $o;
$refs[$flatArray[$i]["parent"]]["children"][] = &$refs[$flatArray[$i]["id"]];
unset($flatArray[$i]);
$flatArray = array_values($flatArray);
}
}
}
}
return $result;
}
它仍然未分类,但现在的格式可以轻松处理
例如,要对所有内容进行排序,现在可以简单地使用递归排序方法,如
sortmyarray($newArr);
回声“;
印刷费($newArr);
回声“;
函数排序数组(&$arr){
uasort($arr,“srt”);
foreach($arr作为$a){
Sortmyarray($a[“儿童]);
}
}
功能srt($a$b){
返回$a[“id”]-$b[“id”];
}
当然,同样的逻辑可以用来操纵标题,显示数据等等。如果你在C++中做了类似的事情,那么你不应该在PHP中做任何事情。关于数组和数组的使用方法也是一样的…:)是的,但无论如何我不知道怎么做。我试过了,但就是不行@它不是复制品!如果你在C++中做了这样的事情,那么你不应该在PHP中做任何事情。差不多一样