Php 如何使用父id创建子数组

Php 如何使用父id创建子数组,php,multidimensional-array,Php,Multidimensional Array,这是我收集的数组 $raw_ar = Array ( 0 => Array ( 'ID' => 6, 'pageTitle' => 'First', 'pageContent' => 'http://localhost/cms/1', 'parentID' => 0 ), 1 => Array ( 'ID' => 7, 'pageTitle' => 'Second', 'pageContent' => 'http://localhost/c

这是我收集的数组

$raw_ar = Array ( 
0 => Array ( 'ID' => 6, 'pageTitle' => 'First', 'pageContent' => 'http://localhost/cms/1', 'parentID' => 0 ),
1 => Array ( 'ID' => 7, 'pageTitle' => 'Second', 'pageContent' => 'http://localhost/cms/2', 'parentID' => 6 ),
2 => Array ( 'ID' => 8, 'pageTitle' => 'Third', 'pageContent' => 'http://localhost/cms/3', 'parentID' => 6 ) ,
3 => Array ( 'ID' => 9, 'pageTitle' => 'Four', 'pageContent' => 'http://localhost/cms/4', 'parentID' => 0 ) 
) ;
我的结果应该是这样的

$final_ar = array(

  0  => array ( 'ID' => 6, 'pageTitle' => 'First', 'pageContent' => 'http://localhost/cms/1', 'parentID' => 0 , 

    'sub_items' => array( 
         0 => array('ID' => 7, 'pageTitle' =>'second', 'pageContent' => 'http://localhost/cms/2', 'parentID' => 6),
         1 => array('ID' => 8, 'pageTitle' => 'Third', 'pageContent' => 'http://localhost/cms/3', 'parentID' => 6),
     )
  ), 
  1 => array('ID' => 9, 'pageTitle' => 'Four', 'pageContent' => 'http://localhost/cms/4', 'parentID' => 0)
);
这是我的密码

$final_ar = array();

foreach ($raw_ar as $value) {
if($value['parentID'] ==0){
    $final_ar[] = $value;
}
else{
    $pID = $value['parentID'];
    foreach ($final_ar as $value1) {
        //echo $value1['ID'].'-'.$pID;
        if($value1['ID'] == $pID){
            //if(isset($value1['sub_items'])){
                $value1['sub_items'][] = $value;
            //}else
                //$value1['sub_items'] = $value;
        }
        $temp_ar[] = $value1;
    }
    $exist = 0; 
    foreach ($final_ar as $key => $val) {
        # code...
        if($val['ID'] == $temp_ar['ID']){
            unset($final_ar[$key]);
            $final_ar[$key] = $temp_ar;
            $exist =1;
            break;
        }
    }
    if($exist == 0)
    $final_arr[] = $temp_ar;
    //$parent_key = array_column($raw_ar,'ID', 'parentID');     
}
}
print_r($final_arr);
我试着用
子项
对它进行编码。但它有助于创建数组。但我不知道如何删除现有的数组一旦修改。结果是这样的

Array ( [0] => Array ( [0] => Array ( [ID] => 6 [pageTitle] => First [pageContent] => http://localhost/cms/1 [parentID] => 0 [sub_items] => Array ( [0] => Array ( [ID] => 7 [pageTitle] => Second [pageContent] => http://localhost/cms/2 [parentID] => 6 ) ) ) ) [1] => Array ( [0] => Array ( [ID] => 6 [pageTitle] => First [pageContent] => http://localhost/cms/1 [parentID] => 0 [sub_items] => Array ( [0] => Array ( [ID] => 7 [pageTitle] => Second [pageContent] => http://localhost/cms/2 [parentID] => 6 ) ) ) [1] => Array ( [ID] => 6 [pageTitle] => First [pageContent] => http://localhost/cms/1 [parentID] => 0 [sub_items] => Array ( [0] => Array ( [ID] => 8 [pageTitle] => Third [pageContent] => http://localhost/cms/3 [parentID] => 6 ) ) ) ) ) 

这里有这么多代码

以下是我的版本:

foreach ($raw_ar as $value) {
    if ($value['parentID'] == 0) {
        $final_ar[$value['ID']] = $value;
    }
}

foreach ($raw_ar as $value) {
    $parent_id = $value['parentID'];
    if (0 < $parent_id) {
        if (!isset($final_ar[$parent_id]['sub_items'])) {
            $final_ar[$parent_id]['sub_items'] = [];
        }

        $final_ar[$parent_id]['sub_items'][] = $value;
    }
}

$final_ar = array_values($final_ar);    // if you need 0-indexed array

这里有这么多代码

以下是我的版本:

foreach ($raw_ar as $value) {
    if ($value['parentID'] == 0) {
        $final_ar[$value['ID']] = $value;
    }
}

foreach ($raw_ar as $value) {
    $parent_id = $value['parentID'];
    if (0 < $parent_id) {
        if (!isset($final_ar[$parent_id]['sub_items'])) {
            $final_ar[$parent_id]['sub_items'] = [];
        }

        $final_ar[$parent_id]['sub_items'][] = $value;
    }
}

$final_ar = array_values($final_ar);    // if you need 0-indexed array
试试这个:

function formatArray($nonFormattedArray) {

    $formattedArray = [];
    $subItems = [];

    foreach ($nonFormattedArray as $item) {
        $pid = $item['parentID'];

        if ($pid != 0) {
            if (isset($subItems[$pid]))
                $subItems[$pid][] = $item;
            else
                $subItems[$pid] = [$item];
        } else
            $formattedArray[] = $item;
    }

    foreach ($formattedArray as $key => $parent) {
        resolveChild($formattedArray[$key], $subItems);
    }

    return $formattedArray;
}

function resolveChild(&$parent, &$subItems) {
    //return if no child
    if (!isset($subItems[$parent['ID']]))
        return $parent;

    foreach ($subItems[$parent['ID']] as $key => $child) {
        if (isset($parent['sub_items']))
            $parent['sub_items'][] = resolveChild($subItems[$parent['ID']][$key], $subItems);
        else
            $parent['sub_items'] = [resolveChild($subItems[$parent['ID']][$key], $subItems)];
     }

    return $parent;
}
现在,formatArray($nonFormattedArray)应该返回您想要的答案

这将独立于父项和子项的顺序,并将减少总迭代次数和执行时间

这将产生一个与数据中的继承一样深的数组

请注意,执行时间将随着继承级别的增加而增加。

尝试以下方法:

function formatArray($nonFormattedArray) {

    $formattedArray = [];
    $subItems = [];

    foreach ($nonFormattedArray as $item) {
        $pid = $item['parentID'];

        if ($pid != 0) {
            if (isset($subItems[$pid]))
                $subItems[$pid][] = $item;
            else
                $subItems[$pid] = [$item];
        } else
            $formattedArray[] = $item;
    }

    foreach ($formattedArray as $key => $parent) {
        resolveChild($formattedArray[$key], $subItems);
    }

    return $formattedArray;
}

function resolveChild(&$parent, &$subItems) {
    //return if no child
    if (!isset($subItems[$parent['ID']]))
        return $parent;

    foreach ($subItems[$parent['ID']] as $key => $child) {
        if (isset($parent['sub_items']))
            $parent['sub_items'][] = resolveChild($subItems[$parent['ID']][$key], $subItems);
        else
            $parent['sub_items'] = [resolveChild($subItems[$parent['ID']][$key], $subItems)];
     }

    return $parent;
}
现在,formatArray($nonFormattedArray)应该返回您想要的答案

这将独立于父项和子项的顺序,并将减少总迭代次数和执行时间

这将产生一个与数据中的继承一样深的数组


请注意,执行时间将随着继承级别的增加而增加。

@Anant是的,已修复。@u\u mulder。两者都给出了一些接近我预期的扩展结果。但是我不希望数组键上有数组键6和9。我是指数组键中使用的ID。你能帮我修一下吗?不应使用数组中的ID。
array\u值
。你没看到我写的第一个片段吗?@Anant是的,修正了。@u\u mulder。两者都给出了一些接近我预期的扩展结果。但是我不希望数组键上有数组键6和9。我是指数组键中使用的ID。你能帮我修一下吗?不应使用数组中的ID。
array\u值
。你没看到我在第一个片段中写的吗?谢谢,你做到了。再澄清一次。此列表可能有更多子列表。你能帮我调用嵌套函数来创建嵌套数组的任意组合吗?你的意思是数组的子项也可能包含子项吗?是的。这样,它可以在子项及其子项的任意组合中工作。我会尝试一下,当我有一个答案时,我会更新答案:)谢谢,你做了。再澄清一次。此列表可能有更多子列表。你能帮我调用嵌套函数来创建嵌套数组的任意组合吗?你的意思是数组的子项也可能包含子项吗?是的。这样,它可以在子项及其子项的任意组合中工作。我将尝试一下,并在有答案时更新答案:)