2009-05-11 4 views
2

Bear mit mir, wenn das unklar ist; Ich habe Probleme damit, meinen Kopf vollständig darum zu wickeln (daher bin ich hier, um um Hilfe zu bitten).Tracking-Tiefe in Rekursion

Ich habe ein Array, das wie folgt aussieht:

Array 
(
[DimA1] => Array 
    (
     [DimB1] => Array 
      (
       [DimC1] => Array 
        (
         [value1] => 13708 
         [value2] => 4.5 
        ) 

       [DimC2] => Array 
        (
         [value1] => 1846 
         [value2] => 15.8 
        ) 

      ) 

     [DimB2] => Array 
      (
       [DimC1] => Array 
        (
         [value1] => 18166 
         [value2] => 6.4 
        ) 
      ) 
[DimA2] => Array 
    (
     ....... etc 

Ich muss durch dieses Array treten und wenn ich nach Wert1 und Wert2 bekommen, muss ich einige Datenbankeinlagen tun. Zu diesem Zeitpunkt muss ich genau wissen, welche Arrays ich gerade durchlaufen habe und ihren Schlüsselnamen als Teil meiner Datenbankeinfügungen verwenden.

Meine aktuelle Lösung sieht wie folgt aus:

public function recurseCounts($array,$dims = array()) { 
    foreach ($array as $key => $value) { 
     $dims[] = $key; 
     if (isset($value['value1']) || isset($value['value2'])) { 
      print_r($value); // For debugging... 
      print_r($dims); // For debugging... 
          // DB Logic to insert dimensions in to DB here 
          // DB Logic to insert values in to DB here 
      array_pop($dims); 
     } else { 
      $this->recurseCounts($value,$dims); 
     } 
    } 
} 

Das funktioniert, bis der Punkt der Schleife DimB2 trifft, das ist, wo die Dinge beginnen whacky bekommen.

Irgendwelche Ideen, wie man das löst?

Antwort

2

Sie sind immer auf $ dims hinzufügen.

Die $ dimmt wird nun gehen:

DimA1 
DimA1, DimB1 
DimA1, DimB1, DimC1 
DimA1, DimB1, DimC2 
DimA1, DimB1, DimB2 
DimA1, DimB1, DimB2, DimC1 
DimA1, DimB1, DimB2, DimC2 

Wenn Sie die array_pop außerhalb der bewegen, wenn Sie in Ordnung sein sollte.

public function recurseCounts($array,$dims = array()) { 
    foreach ($array as $key => $value) { 
      $dims[] = $key; 
      if (isset($value['value1']) || isset($value['value2'])) { 
        print_r($value); // For debugging... 
        print_r($dims); // For debugging... 
         // DB Logic to insert dimensions in to DB here 
         // DB Logic to insert values in to DB here 
      } else { 
        $this->recurseCounts($value,$dims); 
      } 
      array_pop($dims); 
    } 

}

1

Sie benötigen, da die Tasten in der Tiefe „C“ auf die Elemente Spur des vollständigen Pfad zu halten sind die gleichen:

public function recurseCounts($array,$dims = array(),$path = '') { 
     foreach ($array as $key => $value) { 
       $dims[] = ($path ? $Path.'_' : '').$key; // Add the full path (separated by '_') 
       if (isset($value['value1']) || isset($value['value2'])) { 
         print_r($value); // For debugging... 
         print_r($dims); // For debugging... 
          // DB Logic to insert dimensions in to DB here 
          // DB Logic to insert values in to DB here 
         array_pop($dims); 
       } else { 
         $this->recurseCounts($value,$dims,end($depth)); // pass it on 
       } 
     } 
}