Rekursion

MasterGeo

Mitglied
Hallo Leute,

ich bekomme einfach eine Rekursion nicht hin, beziehungsweise das damit verbundene Handling mit Arrays.

Ich bekomme ein Array das etwa so aussieht:


PHP:
Array
(
    [0] => Array
        (
            [ForumCategoryID] => 26
            [CategoryDescription] => Content
            [SortNo] => 0
            [ContainsCategoriesOrForums] => 3
        )

    [1] => Array
        (
            [ForumCategoryID] => 23
            [CategoryDescription] => Eintrag1
            [SortNo] => 1
            [ContainsCategoriesOrForums] => 3
        )

    [2] => Array
        (
            [ForumCategoryID] => 27
            [CategoryDescription] => Eintrag2
            [SortNo] => 2
            [ContainsCategoriesOrForums] => 2
       )
);

Das Array wird mir per Datenbank Prozedur geliefert, auf das ich keinen Einfuss habe.
Sobald in ContainsCategoriesOrForums eine 3 steht, befindet sich ein ähnliches Array, was ich wieder abfragen müsste. Das ganze kann natürlich beliebig geschachtelt sein und deshalb will ich mit Rekursion ran. Nun brauche ich ein Array in dem alle Einträge richtig geschachtelt sind. Ich bekome aber die Zuweisung irgendwie nicht hin.
Hat jemand einen Tipp .... verzweifel langsam.

Danke Georg
 
Ich hab es mal aus dem Kopf getippt. Es wird also ein Mehrdimensionales Array. Ich bekomme die erste Ebene als Array mit Uusatzinformationen. Finde ich in ContainsCategoriesOrForums eine 3 muss ich eine neue Abfrage starten und diese dem Array in richtiger Dimension anfügen. Darin können wieder Ebenen sein usw.
PHP:
 Array 
( 
    [0] => Array 
        ( 
            [ForumCategoryID] => 26 
            [CategoryDescription] => Content 
            [SortNo] => 0 
            [ContainsCategoriesOrForums] => 3 

          [0] =>Array
             (
                [ForumCategoryID] => 36 
                [CategoryDescription] => ContentSub1
                [SortNo] => 0 
                [ContainsCategoriesOrForums] => 2

             )
          [1] =>Array
             (
                [ForumCategoryID] => 37 
                [CategoryDescription] => ContentSub2
                [SortNo] => 0 
                [ContainsCategoriesOrForums] => 2

             )

        ) 

    [1] => Array 
        ( 
            [ForumCategoryID] => 23 
            [CategoryDescription] => Eintrag1 
            [SortNo] => 1 
            [ContainsCategoriesOrForums] => 3 
        ) 

    [2] => Array 
        ( 
            [ForumCategoryID] => 27 
            [CategoryDescription] => Eintrag2 
            [SortNo] => 2 
            [ContainsCategoriesOrForums] => 2 
       ) 
);
 
Hm das ist eine wirklich sehr laue Beschreibung, deines Problems :)
Die Funktion die du erstellen willst, ist eine Fett Rekursive, also daher:
Wenn eine 3 gefunden ist, muss eine neue Dimension bzw. ein neues Feld in deiner Dimension angelegt werden. Wenn du die Werte dieser Dimension angefügt hast, rufst du wieder die Funktion während des return Aufrufs auf, falls eine 3 in ContainsCategoresOrForums vorhanden ist. Falls keine 3 vorhanden ist, schließt sich der Trace Baum langsam wieder, bis am Ende dein Array vollkommen aufgebaut/abgearbeitet ist.

Diese Tatsache funktioniert und dem Vorbehalt nur, falls das Array selbst globalen Scope besitzt.
Mehr kann ich nicht dazu sagen, da keine genauerer Code vorliegt. PM geht auch, da helfe ich gerne genauer :P

 
Rekusionsfunktionen sind immer sehr kurz, daher habe ich meinen schäbigen Versuche nicht gepostet.
Ich tipp es mal gerade aus dem Gedächnis, ist aber eher Pseudocode:
PHP:
$tree = buildTree($meinArray);

function buildTree($Node){

       for($i=0;$i<count($Node;$i++)){
            $GlobalTree[] = $Node[$i];                                  // So geht das nicht!!

            if($Node['ContainsCategoriesOrForums'] == 3 ){
                  $GlobalTree[] = buildTree($Node[$i]);
            }
       
      }
   return $GlobalTree;
}
Kann mal jemand ansetzten, Besonders bei der Arrayzuweisung. So packt es ja alles auf die gleiche Ebene.
 
Mal ein Ansatz:
PHP:
<?
function parseArray($arr,$ebene) {
    $i=0;
    // tue irgendwas mit diesem Array Element
    while(isset($arr[$i])) {
        if ($arr[$i]['ContainsCategoriesOrForums']==3) {
            parseArray($arr[$i],$ebene+1);
        }
        $i++;
    }
}

$a=$deinArray;
parseArray($a,0);
?>
So ganz weiß ich aber auch nicht, was Du willst. Die Datenstruktur finde ich auch etwas wirr, aber, wenn die vorgegeben ist...

Gruß hpvw
 
Zuletzt bearbeitet:
Zurück