所以我在php中有一些项目,有些可能通过parent_id键链接到其他项目.我正在寻找这个数组的排序,以便其父项在此数组中的任何项目最终位于父项目的正下方.
示例:(实际数组有更多键)
some_array[0]['id'] = 15001;
some_array[0]['parent_id'] = 14899;
some_array[1]['id'] = 14723;
some_array[1]['parent_id'] = 0; //parent_id of 0 means item has no parent of its own
some_array[2]['id'] = 14899;
some_array[2]['parent_id'] = 0;
some_array[3]['id'] = 15000;
some_array[3][parent_id'] = 14723;
Run Code Online (Sandbox Code Playgroud)
我想对它们进行排序,以便按顺序排列:
some_array[0]['id'] = 14723;
some_array[1]['id'] = 15000;
some_array[2]['id'] = 14899;
some_array[3]['id'] = 15001;
Run Code Online (Sandbox Code Playgroud)
即.物品就在父母的下方.
提前致谢!
小智 6
我对马特旺回答的简短版本:
/**
* sort parents before children
*
* @param array $objects input objects with attributes 'id' and 'parent'
* @param array $result (optional, reference) internal
* @param integer $parent (optional) internal
* @param integer $depth (optional) internal
* @return array output
*/
function parent_sort(array $objects, array &$result=array(), $parent=0, $depth=0) {
foreach ($objects as $key => $object) {
if ($object->parent == $parent) {
$object->depth = $depth;
array_push($result, $object);
unset($objects[$key]);
parent_sort($objects, $result, $object->id, $depth + 1);
}
}
return $result;
}
Run Code Online (Sandbox Code Playgroud)
唯一的实际区别是它对对象数组而不是数组数组进行排序。
小智 5
我怀疑你们还在寻找一个真正的答案,但它可能会帮助其他人解决同样的问题.下面是一个递归函数,用于使用将子项放在父母下面的数组.
$initial = array(
array(
'name' => 'People',
'ID' => 2,
'parent' => 0
),
array(
'name' => 'Paul',
'ID' => 4,
'parent' => 2
),
array(
'name' => 'Liz',
'ID' => 5,
'parent' => 2
),
array(
'name' => 'Comus',
'ID' => 6,
'parent' => 3
),
array(
'name' => 'Mai',
'ID' => 7,
'parent' => 2
),
array(
'name' => 'Titus',
'ID' => 8,
'parent' => 3
),
array(
'name' => 'Adult',
'ID' => 9,
'parent' => 6
),
array(
'name' => 'Puppy',
'ID' => 10,
'parent' => 8
),
array(
'name' => 'Programmers',
'ID' => 11,
'parent' => 4
) ,
array(
'name' => 'Animals',
'ID' => 3,
'parent' => 0
)
);
/*---------------------------------
function parentChildSort_r
$idField = The item's ID identifier (required)
$parentField = The item's parent identifier (required)
$els = The array (required)
$parentID = The parent ID for which to sort (internal)
$result = The result set (internal)
$depth = The depth (internal)
----------------------------------*/
function parentChildSort_r($idField, $parentField, $els, $parentID = 0, &$result = array(), &$depth = 0){
foreach ($els as $key => $value):
if ($value[$parentField] == $parentID){
$value['depth'] = $depth;
array_push($result, $value);
unset($els[$key]);
$oldParent = $parentID;
$parentID = $value[$idField];
$depth++;
parentChildSort_r($idField,$parentField, $els, $parentID, $result, $depth);
$parentID = $oldParent;
$depth--;
}
endforeach;
return $result;
}
$result = parentChildSort_r('ID','parent',$initial);
print '<pre>';
print_r($result);
print '</pre>';
Run Code Online (Sandbox Code Playgroud)
这是一种减速方法,它从原始数组中删除元素,并按正确的顺序将它们放入结果集中.我为你做了一些通用的,所以它只需要你告诉它你的'ID'字段和'parent'字段被调用.顶级项目必须具有0的parent_id(但是您将其命名).
| 归档时间: |
|
| 查看次数: |
4195 次 |
| 最近记录: |