Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php函数,用于按正确顺序将递归数组转换为列表_Php_Function_Recursion - Fatal编程技术网

php函数,用于按正确顺序将递归数组转换为列表

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(

我有一个返回类别列表的外部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(
    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没有父项。这正是我需要的。非常感谢!!这正是我需要的。非常感谢!!