2016-05-16 10 views
1

Ich habe eine Funktion geschrieben, um ein Single-Dimension-Array (Adjazenzliste) in ein multidimensionales Array zu konvertieren. Ich versuche, einen aufgezählten Pfad in $ aCat zu injizieren.Geben Sie den nummerierten Pfad in foreach ein> single to multi-dimensional array

Quelle (eindimensional)

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

Ich habe die folgende Funktion, dies zu multidimensionalen erweitern aus.

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

Dies ist das Ergebnis. Perfekt bis jetzt.

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

Wie beende ich oben mit:

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

Antwort

0

wie dies Ihr Funktionscode ändern:

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

Prost Eduardo. Ich habe es ähnlich versucht, aber am Ende habe ich ein merkwürdiges Verhalten bei etwa 4 Stufen. Die "parent_id" wird nicht an einige der Pfade angehängt. – supert3d

+0

@ supert3d Ich habe es ohne Probleme bis zu 6 Ebenen getestet. –

+0

Könnte es einen anderen Grund geben? Doppelte IDs? Ändern des resultierenden Arrays, um die Umgebung genauer widerzuspiegeln. – supert3d

0

Lösung, die für mich gearbeitet:

Diese Methode Rewrite aufgelöst meine Problem. Mehrere Durchgänge auf dem Array gemacht.

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; 

} 

großer Dank an pyson, deren Antwort (unten) in einem anderen ähnlichen Thread half mir aus.

create array tree from array list

Verwandte Themen