phpbar.de logo

Mailinglisten-Archive

[php] Array aus Rekursion

[php] Array aus Rekursion

Lutz Zetzsche Lutz.Zetzsche at sea-rescue.de
Die Nov 20 16:25:57 CET 2007


Hallo Michael,

Am Dienstag, 20. November 2007 schrieb Michael Borchers:
> http://www.php-homepage.de/artikel/artikel13.html
>
> Zu folgendem Beispiel eine Frage:
>
> Tabelle "Stammbaum"
>
>        Id  name  nachfahre_von
>        1  Opa August   0
>        2  Onkle Karl   1
>        3  Tante Ute   1
>        4  Cousin Maik   2
>        5  Cousine Inge   3
>        6  Mutter  1
>        7  Ich  6
>        8  Mein Bruder   6
>        9  Sohn meines Bruders  8
>
>
> Möchte man nun z.B. diese Baumstruktur geordnet uns strukturiert
> ausgeben lassen, geht dies wiederum mit einer rekursiven Funktion:
>
> function get_tree($who,$ebene) {
>  $res=mysql_query ("select * from stammbaum where
> nachfahre_von=$who;"); while ($verwandter=mysql_fetch_array($res)) {
>     echo $ebene.$verwandter[name]."<br>";
>     get_tree($verwandter[id],$ebene."&nbsp;&nbsp;&nbsp;&nbsp;");
>   }
> }
>
>
> Wie müsste ich vorgehen, wenn ich als Resultat ein Array haben
> möchte? Sprich anstatt '&nbsp;' geht der Zeiger des Arrays weiter auf
> eine nächste Ebene...
>
>
> Opa August
>     Onkel Karl
>         Cousin Maik
>     Tante Ute
>         Cousine Inge
>     Mutter
>         Ich
>         Mein Bruder
>             Sohn meines Bruders
>
>
> =>
>
> Opa August wäre dann z.B. [0] und Onkel Karl [0][0].
> Cousin Mail wäre [0][0][0] während Tante Ute [0][1] sein müsste etc.
>
> Versteht ihr was ich meine?
>
> Besten Dank, wenn mir das jmd. erklären könnte!

ich habe das mal so gelöst:


    public function getKeywordHierarchy(array $aKeywordIndexNode, array 
&$aHierarchicalIndexNode, $iKeywordParentId) {

      foreach ($aKeywordIndexNode as $iKey => $aKeywordIndexNode_i) {
        if ($aKeywordIndexNode_i['KeywordParentId'] == 
$iKeywordParentId) {
          unset($this->aKeywordIndexNode_tmp[$iKey]);
          $aKeywordIndexNode_i['aSubNodes'] = array();
          $this->getKeywordHierarchy($this->aKeywordIndexNode_tmp, 
$aKeywordIndexNode_i['aSubNodes'], $aKeywordIndexNode_i['KeywordId']);
          $aHierarchicalIndexNode[] = $aKeywordIndexNode_i;
        }
      }

      return $aHierarchicalIndexNode;
    }


Aufruf:

$aKeywordIndexNodes  = 
$this->getKeywordHierarchy($this->aKeywordIndexNode_tmp, array(), 0);


Ich kopiere das jetzt einfach mal so hier herein, weil ich gerade keine 
Zeit für eine ausführliche Erklärung habe. Ich hoffe, Du kommst 
trotzdem so damit zu recht. Das unset() dient übrigens dazu, nicht mehr 
benötigte Daten zu entfernen und damit die Schleifendurchläufe soweit 
wie möglich zu reduzieren.


Viele Grüße,
Lutz

php::bar PHP Wiki   -   Listenarchive