2016-05-16 17 views
0

我有這種方法將採用單維數組並將其轉換爲多維數組。這是類別的鄰接列表。我正在注入一個枚舉路徑。它工作90%的時間。PHP foreach在一些迭代中無序地注入新索引

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 

但在一些迭代後「分」和程序將失敗,它會注入「路徑」。

失敗:

[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 

注意路徑和標題如何子注射後注射。任何想法爲什麼?

+0

我懷疑這是因爲您使用的是引用。你確定你需要這個嗎? – Barmar

回答

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