PHP foreach在一些迭代中不按顺序注入新索引

时间:2016-05-16 21:45:20

标签: php sorting multidimensional-array

我有这个方法,它将采用单维数组并将其转换为多维数组。它是一个类别的邻接列表。我随时都会注入一个枚举路径。它有90%的时间有效。

public function fnExpandArray($aData){

    $aNested = array();

    foreach($aData as &$aCat){

        if(isset($aData[$aCat['parent_id']])){

            $aData[$aCat['parent_id']]['sub'][$aCat['id']] = &$aCat;
            $aData[$aCat['parent_id']]['sub'][$aCat['id']]['path'] = $aData[$aCat['parent_id']]['path'] . '_' . $aCat['id'];

        } else {

            $aNested[$aCat['id']] = &$aCat;
            $aNested[$aCat['id']]['path'] = $aCat['id'];

        }

    }

    unset($aCat);
    return $aNested;
}

这种方法在90%的情况下正常工作,但是"路径"正在注入的索引有时会在之后注入" sub"索引并导致枚举路径计算不正确。示例:

正确

 [18] => Array
                    (
                        [id] => 18
                        [parent_id] => 1
                        [title] => Category 1
                        [path] => 1_18
                        [sub] => Array
                            (
                                [150] => Array
                                    (
                                        [id] => 150
                                        [parent_id] => 18
                                        [title] => Category 2
                                        [path] => 1_18_150

但是在一些迭代中,它会注入“路径”。在' sub'之后而且例程将失败。

失败:

  [45] => Array
                    (
                        [id] => 45
                        [parent_id] => 2
                        [sub] => Array
                            (
                                [10] => Array
                                    (
                                        [id] => 10
                                        [parent_id] => 45
                                        [sub] => Array
                                            (
                                                [152] => Array
                                                    (
                                                        [id] => 152
                                                        [parent_id] => 10
                                                        [title] => Category 1
                                                        [path] => _152
                                                    )

                                                [79] => Array
                                                    (
                                                        [id] => 79
                                                        [parent_id] => 10
                                                        [title] => Category 2
                                                        [path] => _10_79
                                                    )


                                            )

                                        [title] => Dryers
                                        [path] => _10

注意子注入后如何注入路径和标题。知道为什么吗?

1 个答案:

答案 0 :(得分:0)

此方法重写解决了我的问题。在阵列上多次传球。

public function fnExpandTaxonomy(&$aData) {

    $aTree = array();

    // Loop original flat array, build associative and inject additional indices as required. 
    foreach($aData as $iKey => &$aCat){
        $aTree[$aCat['id']] = &$aCat;
        $aTree[$aCat['id']]['level'] = 0; 
        $aTree[$aCat['id']]['path'] = $aCat['id']; 
        $aTree[$aCat['id']]['sub'] = array(); 
    }

    // Loop - Add children to parents. 
    foreach($aTree as $iKey => &$aCat) {
        if(!$aCat['parent_id']) continue;

        unset($aCat['level'],$aCat['path'],$aCat['sub']);
        $aCat['level'] = $aTree[$aCat['parent_id']]['level']+1; 
        $aCat['path'] = $aTree[$aCat['parent_id']]['path'].'_'.$aCat['id']; 
        $aTree[$aCat['parent_id']]['sub'][$aCat['id']] = &$aCat;

    }

    // Loop again, remove any items that don't have a parent of 0;
    foreach($aTree as $iKey => &$aCat) {
      if(!$aCat['parent_id']) continue;
      unset($aTree[$iKey]);
    }

    unset($aCat);
    return $aTree;  

}   

非常感谢pyson,他在另一个类似线程中的答案(下图)帮助了我。

create array tree from array list