php函数,用于按正确顺序将递归数组转换为列表
我有一个返回类别列表的外部API: 当前阵列:php函数,用于按正确顺序将递归数组转换为列表,php,function,recursion,Php,Function,Recursion,我有一个返回类别列表的外部API: 当前阵列: id | parent | name 3 | 6 | Sub 6 | 9 | Test 9 | 0 | Parent 1 2 | 0 | Parent 2 id | parent | name 9 | 0 | Parent 1 2 | 0 | Parent 2 6 | 9 | Test 3 | 6 | Sub $initial = array(
id | parent | name
3 | 6 | Sub
6 | 9 | Test
9 | 0 | Parent 1
2 | 0 | Parent 2
id | parent | name
9 | 0 | Parent 1
2 | 0 | Parent 2
6 | 9 | Test
3 | 6 | Sub
$initial = array(
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' => 'People',
'id' => 2,
'parent' => 0
),
array(
'name' => 'Puppy',
'id' => 10,
'parent' => 8
),
array(
'name' => 'Programmers',
'id' => 11,
'parent' => 4
),
);
必须是:
id | parent | name
3 | 6 | Sub
6 | 9 | Test
9 | 0 | Parent 1
2 | 0 | Parent 2
id | parent | name
9 | 0 | Parent 1
2 | 0 | Parent 2
6 | 9 | Test
3 | 6 | Sub
$initial = array(
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' => 'People',
'id' => 2,
'parent' => 0
),
array(
'name' => 'Puppy',
'id' => 10,
'parent' => 8
),
array(
'name' => 'Programmers',
'id' => 11,
'parent' => 4
),
);
现在我将按照正确的顺序转换这个列表(从父数组到子数组),这样我就可以简单地访问这个新数组并将它插入到我的数据库中(使用我的自定义父数组id)
我创建了一个函数,但效果不好:
// DOES NOT WORK!!
function sortArrayFromParentToChilds($array)
{
$output = [];
foreach ($array as $key => $a) {
// search in new array
if (empty($output)) {
$output[] = $a;
unset($array[$key]);
} else {
if (findSubCategory($a, $output)) {
array_push($output, $a);
} else {
array_unshift($output, $a);
}
unset($array[$key]);
}
}
return $output;
}
function findSubCategory($id, $output)
{
foreach ($output as $o) {
if ($o['parent'] == $id) {
return true;
}
}
return false;
}
$result = sortArrayFromParentToChilds($initial);
谁能帮助我使这个函数工作
更新:添加了一些示例数据:
id | parent | name
3 | 6 | Sub
6 | 9 | Test
9 | 0 | Parent 1
2 | 0 | Parent 2
id | parent | name
9 | 0 | Parent 1
2 | 0 | Parent 2
6 | 9 | Test
3 | 6 | Sub
$initial = array(
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' => 'People',
'id' => 2,
'parent' => 0
),
array(
'name' => 'Puppy',
'id' => 10,
'parent' => 8
),
array(
'name' => 'Programmers',
'id' => 11,
'parent' => 4
),
);
这应该行得通
function orderArray($arr){
$ordArr = array();
$parentKeys = array(0); // Top Level elements have 0 in parent field
$newParentKeys = array();
$goon = true;
// search for parentkeys
while($goon) {
$goon = false;
foreach($arr as $row) {
if (in_array( $row['parent'], $parentKeys)){ // There are kids
$newParentKeys[] = $row['id']; // future parent key
$ordArray[] = $row; // add element in order
$goon = true; // Keep going another level down
}
}
$parentKeys = $newParentKeys; // Update parent keys for the next level
$newParentKeys = array(); // clear this array
}
return $ordArray;
}
这应该行得通
function orderArray($arr){
$ordArr = array();
$parentKeys = array(0); // Top Level elements have 0 in parent field
$newParentKeys = array();
$goon = true;
// search for parentkeys
while($goon) {
$goon = false;
foreach($arr as $row) {
if (in_array( $row['parent'], $parentKeys)){ // There are kids
$newParentKeys[] = $row['id']; // future parent key
$ordArray[] = $row; // add element in order
$goon = true; // Keep going another level down
}
}
$parentKeys = $newParentKeys; // Update parent keys for the next level
$newParentKeys = array(); // clear this array
}
return $ordArray;
}
此解决方案查找没有父元素的所有元素,将它们存储在$sortArray中,并在$data中删除它们
$data = $initial;
$sortData = [];
while(count($data)){
$ids = array_column($data,'id');
foreach($data as $key => $row){
if(in_array($row['parent'],$ids)) continue;
$sortData[] = $row;
unset($data[$key]);
}
}
echo '<pre>';
var_export($sortData);
注意:$data中不能有id==parent的元素。此解决方案查找所有没有父元素的元素,将它们存储在$sortArray中,并在$data中删除它们
$data = $initial;
$sortData = [];
while(count($data)){
$ids = array_column($data,'id');
foreach($data as $key => $row){
if(in_array($row['parent'],$ids)) continue;
$sortData[] = $row;
unset($data[$key]);
}
}
echo '<pre>';
var_export($sortData);
注意:$data中不能有id==parent的元素。生成的数组应该是什么样子,函数的结果是什么?我已经用期望的结果更新了我的问题!如果重新排序的唯一目的是在数据库中按特定顺序插入,则无需重新排序。您始终可以使用orderby从数据库中检索显示的“数组”看起来不像数组。您可以用代码或
var\u export
显示它吗?生成的数组应该是什么样子,函数的结果是什么?我已经用所需的结果更新了我的问题!如果重新排序的唯一目的是在数据库中按特定顺序插入,则无需重新排序。您始终可以使用orderby从数据库中检索显示的“数组”看起来不像数组。请您将其显示为代码中的显示方式,或使用var\u export
,好吗?对不起,它不起作用。我已经在我的原始帖子中添加了一些示例数据,当我插入这些数据时,它不起作用…您的示例数据中缺少Id 3。因此,此ID(6,8)的子项和后续子项(9,10)将不会列出。我假设只有parent=0才能开始树遍历。我认为这种方法很好。初始日期为,因此只有parent==0没有父项。很抱歉,它不起作用。我已经在我的原始帖子中添加了一些示例数据,当我插入这些数据时,它不起作用…您的示例数据中缺少Id 3。因此,此ID(6,8)的子项和后续子项(9,10)将不会列出。我假设只有parent=0才能开始树遍历。我认为这种方法很好。初始日期是这样的,只有parent==0没有父项。这正是我需要的。非常感谢!!这正是我需要的。非常感谢!!