2016-05-16 117 views
1

我已经编写了一个将单维数组(邻接列表)转换为多维数组的函数。我试图将枚举路径注入$ aCat。将枚举路径注入到foreach中>单维数组到多维数组

源(一维)

[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() 

回答

0

修改你的功能代码是这样的:为我工作

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

干杯爱德华多。我尝试过类似的方式,但最终我在大约4级的时候出现了奇怪的行为。 “parent_id”没有被预先附加到某些路径。 – supert3d

+0

@ supert3d我对它进行了6级深度测试,没有任何问题。 –

+0

难道还有其他原因吗?重复的ID?修改结果数组以更准确地反映环境。 – supert3d

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