将枚举路径注入foreach>;从单数组到多维数组


Inject enumerated path into foreach > single to multi-dimensional array

我编写了一个函数,用于将一维数组(邻接列表)转换为多维数组。我正在尝试将枚举路径注入$aCat。

来源(一维)

[2] => Array
    (
        [id] => 2
        [parent_id] => 0
        [name] => Cat 1 
    )
[45] => Array 
    (
       [id] => 45
       [parent_id] => 2
       [name] => Cat 2
   )
[46] => Array 
    (
       [id] => 46
       [parent_id] => 2
       [name] => Cat 4
   )
[47] => Array 
    (
       [id] => 47
       [parent_id] => 2
       [name] => Cat 5
   )
[10] => Array
   (
       [id] => 10 
       [parent_id] => 45
       [name] => Cat 3
  )

我有以下函数将其扩展到多维。

function fnExpandArray($aData){
    $aNested = array();
    foreach($aData as &$aCat){
        if(isset($aData[$aCat['parent_id']])){
            $aData[$aCat['parent_id']]['sub'][$aCat['id']] = &$aCat;    
        } else {
            $aNested[$aCat['id']] = &$aCat;
        }
    }
    unset($aCat);
    return $aNested;
}

这就是结果。到目前为止非常完美。

[2] => Array
    (
        [id] => 2
        [parent_id] => 0
        [name] => Cat 1
        [sub] => Array
            (
                [45] => Array
                    (
                        [id] => 45
                        [parent_id] => 2
                        [name] => Cat 2 
                        [sub] => Array
                            (
                                [10] => Array
                                    (
                                        [id] => 10
                                        [parent_id] => 45
                                        [name] => Cat 3
                                        [sub] => Array ()
                                    )
                            )
                    )
                [46] => Array
                    (
                        [id] => 46
                        [parent_id] => 2
                        [name] => Cat 4 
                        [sub] => Array()
                     )
                [47] => Array
                    (
                        [id] => 47
                        [parent_id] => 2
                        [name] => Cat 5 
                        [sub] => Array()

如何结束:

[2] => Array
    (
        [id] => 2
        [parent_id] => 0
        [name] => Cat 1
        [path] => 2
        [sub] => Array
            (
                [45] => Array
                    (
                        [id] => 45
                        [parent_id] => 2
                        [name] => Cat 2 
                        [path] => 2_45
                        [sub] => Array
                            (
                                [10] => Array
                                    (
                                        [id] => 10
                                        [parent_id] => 45
                                        [name] => Cat 3
                                        [path] => 2_45_10
                                        [sub] => Array ()
                                    )
                            )
                    )
                [46] => Array
                    (
                        [id] => 46
                        [parent_id] => 2
                        [name] => Cat 4 
                        [path] => 2_46
                        [sub] => Array()
                     )
                [47] => Array
                    (
                        [id] => 47
                        [parent_id] => 2
                        [name] => Cat 5
                        [path] => 2_47
                        [sub] => Array()

这样修改函数代码:

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;
}

适用于我的解决方案:

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

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

从数组列表创建数组树