PHP foreach在某些迭代中无序地注入新索引


PHP foreach injecting new index out of order on some iterations

我有一个方法,它将获取一个一维数组并将其转换为多维数组。这是一个类别的邻接列表。我边走边注入一条枚举路径。它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%的情况下都可以正常工作,但是,正在注入的"路径"索引有时会在"子"索引之后注入,从而导致枚举路径的计算不正确。示例:

正确

 [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"之后注入"path",例程就会失败。

失败:

  [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

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

这个方法重写解决了我的问题。对阵列进行了多次传球。

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,他的回答(下面)在另一个类似的帖子中帮助了我。

从数组列表创建数组树