Rekursive Funktion - was stimmt hier nicht?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Rekursive Funktion - was stimmt hier nicht?

    Hallo,

    ich habe ein größeres Problem.

    Der Ausgangs-Array, der aus der Datenbank kommt, ist 1-dimensional und sortiert nach Ebene und Sortierung.
    Beispielcode (der folgende Array ist "$inputArray"):

    PHP-Code:
    Array
    (
        [
    1] => Array
            (
                [
    name] => Root
                
    [stage] => 0
                
    [sort] => 0
                
    [has_child] => 1
                
    [parent_id] => 0
            
    )

        [
    2] => Array
            (
                [
    name] => Eintrag 1
                
    [stage] => 1
                
    [sort] => 0
                
    [has_child] => 0
                
    [parent_id] => 1
            
    )

        [
    3] => Array
            (
                [
    name] => Eintrag 2
                
    [stage] => 1
                
    [sort] => 1
                
    [has_child] => 1
                
    [parent_id] => 1
            
    )

        [
    20] => Array
            (
                [
    name] => Eintrag 3
                
    [stage] => 1
                
    [sort] => 2
                
    [has_child] => 0
                
    [parent_id] => 1
            
    )



    Das Array soll verschachtelt werden, dazu stehen für jeden Eintrag die Werte parent_id und has_child zur Verfügung. In "parent_id" steht die ID des Elternelements, in "has_child" steht eine 1, falls der Eintrag ein Kind hat oder 0.

    Ich habe nun versucht den Array entsprechend zu verschachteln, stoße aber bei der Rekursion auf ein Problem:

    PHP-Code:
    function rek$inputArray )
    {
      foreach( 
    $inputArray as $k => $v )
      {
        if( 
    $v[parent_id] > && isset($inputArray[$v[parent_id]]) )
        {
          
    $inputArray[$v[parent_id]][elemente][$k] = $inputArray[$k];
          unset(
    $inputArray[$k]);
        }
      }

      
    #if( count($inputArray) > 1 )
        #$inputArray = rek($inputArray);
      
    return( $inputArray );

    }

    $arr rek($inputArray);

    echo 
    "Ausgabe:<pre>";
    print_r($arr);
    echo 
    "</pre>"
    Habe die Zeilen, die Probleme machen auskommentiert. Wenn sie einkommentiert sind, kommt nichts mehr raus, es kommt zu einem Fehler.

    Verstehe leider nicht, warum diese Funktion nicht funktioniert?
    Gruß,
    Peter

  • #2
    Hi,

    damit produzierst Du eine Endlosschleife. Du löschst Elemente aus dem Array, ohne zu prüfen, ob diese noch
    "Kinder" haben, die bearbeitet werden wollen. Also wird Dein Array nie auf ein Element reduziert.

    Eine Rekursion ist das auch nicht wirklich. Du arbeitest ja immer auf dem kompletten Array, dh. Du
    könntest theoretisch auch 'ne while-Schleife drumzupacken, was aleerdings das Problem nicht löst.
    Mir sieht das Ganze nicht gerade optimal aus, bin aber gerade wegen fortgeschrittener Uhrzeit ziemlich
    ideenlos

    LG

    Kommentar


    • #3
      Hi,

      divide and conquor. Zerleg dir das problem in teilprobleme.
      Es läuft darauf hinaus dass du zu einem gegebenen knoten immer
      die knoten finden musst deren parent_id == gegebener_knoten_id.
      Und die gefundenen dann als kindelemente dem gegebenen knoten hinzufügst.
      Das machst du dann rekursive für jedes der gefundenen kindelemente.

      greets
      (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

      Kommentar

      Lädt...
      X