Missing values after return (rekursiv call)

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

  • Missing values after return (rekursiv call)

    Hallo zusammen,

    Ich verliere die Werte nachdem ich die funktion (FfillGroup) cancele mit return obwohl ich eine globale variable ($Array3d) benutze (ohne globale genau die gleiche ... ) solange ich die funktion rekursiv aufrufe sind die werte da.

    der code hier ist halt ohne login pw infos zur datenbank aber der table sieht so aus:

    hier noch ein mail das ich an nen kumpel in genau der sache geschickt habe ich hoffe es bringt was:

    -----------------------------------------------------------------------

    Codezeile 143 würd ich sagen.

    Eigentlich läuft alles gut der Array sieht am ende in der function nach dem rekursiv call so aus:

    5 9 8 7 6
    4
    1
    10

    In der globalen Variable.

    Doch sobald ich im aufruflevel zurück bin sind die werte weg. Doch die Werte welche ich fix reinschreibe also BspArray[10][0][0] = 120 bleiben da.

    Das prinzip ist:

    Erst wird oberstes rootelement definiert ist 16 also:

    16

    Dann erste reihe mit alles 16er als root

    16
    5
    4
    1
    10

    Danach alle mit 5 als root.

    16
    5 9 8 7 6
    4
    1
    10

    Usw.

    Nur die werte bleiben nicht. (bis zum return aber imho schon)
    ---------------------------------------------------------------------------


    danke für hilfe im voraus.
    gruss
    (ge)stress(t)

    id doc_id group_id rootgroup_id
    5 1 5 16
    4 1 4 16
    1 1 1 16
    9 1 9 5
    8 1 8 5
    7 1 7 5
    6 1 6 5
    18 1 11 3
    16 1 15 3
    15 1 13 3
    14 1 12 3
    16 1 15 2
    13 1 13 2
    12 1 12 2
    11 1 11 2
    3 1 3 1
    2 1 2 1
    17 1 16 0
    10 1 10 16
    19 1 14 4

    hier der code:

    <html>

    <head>
    <title></title>
    </head>

    <body>


    PHP-Code:
    <?php

    function initarray()
    {
            
    $y 0;
            
    $x 0;
            
    $z 0;
            global 
    $test;
            
    $test = array();
            for(
    $y=0$y<5$y++) {
                    
    $test[$y][$x][$z] = 0;
                    for(
    $x=0$x<5$x++) {
                            
    $test[$y][$x][$z] = 0;
                            for(
    $z=0$z<5$z++) {
                                    
    $test[$y][$x][$z] = 0;


                            }
                    }
            }

            return 
    $test;

    }




    function 
    FfillGroup($sendY$sendX$sendZ$counter$rootgroup$firstflag$Array3d)
    {
    //        $dArray = Array(Array(Array(50)));


            
    $dblink mysql_connect("xxxxxxxxx","xxxxxxxx","xxxxxxx") or die ("No connection");
            print 
    "dbaccess success";
            
    mysql_select_db("plenu1") or die ("bla");

            
    $sql "SELECT * FROM docgroupmap where doc_id = 1 ORDER BY rootgroup_id";


            
    $query mysql_query($sql$dblink);

            
    $y $sendY;
            
    $x $sendX;
            
    $z 0;

            if (
    $counter == 0) {
                     
                 global 
    $Array3d;     
                
    $test initarray();
                
    $Array3d $test;
                echo 
    "test";
                
    $Array3d[0][0][0] = 0;
                
    $rootgroup 16;
                
                
    $Array3d[5][5][0] = 1203;
                
                
    $Array3d[20][0][0] = 112;
                
    $sendY 1;
            }
            else {
                    while (
    $result mysql_fetch_array($query)) {
                            if (
    $result["rootgroup_id"] == $rootgroup) {
                                    switch (
    $counter) {
                                    case 
    1:
                                            if (
    $firstflag == 0) {
                                                    
    $sendY $y;
                                                    
    $sendX 1;
                                                    
    $firstflag 1;
                                            }
                                                    
    $Array3d[$y][$x][$z] = $result["group_id"];
                                                    echo 
    "dasY" $y;
                                                    echo 
    $x;
                                                    echo 
    $z;
                                                    echo 
    $Array3d[$y][$x][$z];
                                                    (
    $y++);
                                            break;
                                    case 
    2:
                                            
                                            if (
    $firstflag == 0) {
                                                    
    $sendY $y 1;
                                                    
    $sendX $x;
                                                    
    $firstflag 1;
                                            }

                                                    
    $Array3d[$y][$x][$z] = $result["group_id"];
                                                    echo 
    $Array3d[$y][$x][$z];
                                                    (
    $x++);
                                
                                            break;
                                    }

                          }

                    }
                        
                
    $rootgroup $Array3d[$sendY][$x][$z];   
             }
          
            echo 
    $Array3d[0][0][0];
            echo 
    $Array3d[1][0][0];
            echo 
    $Array3d[2][0][0];        
            echo 
    $Array3d[3][0][0];
            echo 
    $Array3d[4][0][0];
    //        mysql_free_result($query);
            
    ($counter++);
    //        echo $counter;
            
    if ($counter 3) {
               
    FfillGroup($sendY$sendX$z$counter$rootgroup0$Array3d);
            }
            else {
                return 
    $Array3d;
            }
    }

            
    FfillGroup(0,0,0,0,0,0,0);
    //      echo $dArray[1][0][0];
            
    echo $Array3d[0][0][0];
            echo 
    $Array3d[1][0][0];
            echo 
    $Array3d[2][0][0];
            echo 
    $Array3d[20][0][0];
    /*        echo $dArray[3][0][0];
            echo $dArray[4][0][0];
            echo $dArray[5][0][0];
            echo $dArray[6][0][0];
    */                    

            
    print_r($Array3d);
    ?>
    <br>
    </body>

    </html>
    Zuletzt geändert von stress; 27.11.2007, 16:19.

  • #2
    Erst lesen: Posten von Problemen (oder UNSERE REGELN)

    Kommentar


    • #3
      Eingrenzen lässt sich der Code schlecht da der Grund für die vermissten values nicht direkt bekannt ist.

      Es ist kein syntaxfehler.. eingrenzen lässt sich der Code auch nicht da ich sonst die Funktion KOMPLETT umschreiben kann. die scheisse bringt ja output.

      dann hier noch der output auf der geladenen Seite(das bringt wirklich was):

      dbaccess successtest00000dbaccess successdasY1005dasY2004dasY3001dasY40010054110dbaccess success987605411054110000112Array ( [0] => Array ( [0] => Array ( [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) [1] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) [2] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) [3] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) [4] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) ) [1] => Array ( [5] => Array ( [5] => 0 ) [0] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) [1] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) [2] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) [3] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) [4] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) ) [2] => Array ( [5] => Array ( [5] => 0 ) [0] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) [1] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) [2] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) [3] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) [4] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) ) [3] => Array ( [5] => Array ( [5] => 0 ) [0] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) [1] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) [2] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) [3] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) [4] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) ) [4] => Array ( [5] => Array ( [5] => 0 ) [0] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) [1] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) [2] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) [3] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) [4] => Array ( [5] => 0 [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) ) [5] => Array ( [5] => Array ( [0] => 1203 ) ) [20] => Array ( [0] => Array ( [0] => 112 ) ) )

      Kommentar


      • #4
        Nochmals die Frage
        Erst lesen: Posten von Problemen (oder UNSERE REGELN)
        Haste wohl kaum gemacht, sonst hättest du im Code wohl die PHP-Tags des Forums verwendet,
        PHP-Code:
        die('einen Text in PHP viel besser lesbar machen'); 
        Ausserdem könntest du den Code, wenn du schon dabei bist, auch etwas lesbarer einrücken.

        Gruss

        tobi
        Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

        [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
        Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

        Kommentar


        • #5
          sieht besser aus so eindeutig

          Kommentar


          • #6
            Ich verliere die Werte nachdem ich die funktion cancele mit return obwohl ich eine globale variable benutze (ohne globale genau die gleiche ... ) solange ich die funktion rekursiv aufrufe sind die werte da.
            Von welcher Funktion redest du? Von welcher Variable redest du?

            Kommentar


            • #7
              function FfillGroup

              variable $Array3d

              Kommentar


              • #8
                Versuch mal

                function FfillGroup($sendY, $sendX, $sendZ, $counter, $rootgroup, $firstflag, &$Array3d)

                Kommentar


                • #9
                  Und wenn das immer noch nicht klappen will, dann setze anstelle eines returns einfach ein echo wert."\r\n" ein. Vor der Fkt wirfst du die output buffer an, damit werden alle echos in den Buffer geschrieben. Dann nach Durchlauf der Fkt liest du den Buffer aus und spitzt den Inhalt in ein Array
                  PHP-Code:
                  ob_start();
                  deineRekursiveFkt($params);
                  $var ob_get_contents();
                  $var explode("\r\n",$var); 
                  Nur so als Gedankenanstoss...
                  Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                  [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                  Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                  Kommentar


                  • #10
                    Jungs ihr seid die besten, speziellen dank an meinen Lieblingsmod. Das mit dem fucking &.

                    Gehe ich richtig in der Annahme das die Aufgrund des sprunges in eine Funktion die Variable zweimal deklariert (sozusagen) wird mit unterschiedlichen Speicheradressen und beim rausspringen nimmt er wieder die alte Variable.

                    danke auch für den Tipp mit dem buffer kann ich sicher mal brauchen.

                    http://ch2.php.net/outcontrol

                    nettes Forum

                    danke und Gruss
                    stress

                    Kommentar


                    • #11
                      Ich hab den Code nicht nachvollzogen, aber ich gehe davon aus, dass da irgendwo ne Überschreibung oder so stattfinden.

                      Kommentar


                      • #12
                        Gehe ich richtig in der Annahme das die Aufgrund des sprunges in eine Funktion die Variable zweimal deklariert (sozusagen) wird mit unterschiedlichen Speicheradressen und beim rausspringen nimmt er wieder die alte Variable.
                        Dieser schon etwas ältere Artikel erklärt das sehr schön.

                        Kommentar


                        • #13
                          interessanter artikel

                          also wäre das wohl auch mittels zwischenspeichern in variable unset des ursprungvariable und danach rückspeichern.

                          hier habe ich noch die Funktion die so jetzt funzt spitzt ne variable nach dem table oben rein (für den dens interessiert) (16 als doc root element steht immer allein daher keine sep. dimension für das)

                          PHP-Code:

                          function FfillGroup($sendY$sendX$sendZ$counter$rootgroup$firstflag, &$Array3d$saveY$xPoscount)
                          {
                          //        $dArray = Array(Array(Array(50)));


                                  
                          $dblink mysql_connect("xxxxxxxxxxx","xxxxxxxx","xxxxxxxxxx") or die ("No connection");
                                  print 
                          "dbaccess success";
                                  
                          mysql_select_db("xxxxxxxx") or die ("bla");

                                  
                          $sql "SELECT * FROM docgroupmap where doc_id = 1 ORDER BY rootgroup_id";


                                  
                          $query mysql_query($sql$dblink);
                                  
                          $y $sendY;
                                  
                          $x $sendX;
                                  
                          $z 0;
                          //      echo "test2";
                          //        echo $counter;
                                  
                          if ($counter == 0) {
                                      echo 
                          "test";
                                      
                          $Array3d[0][0][0] = 0;
                                      
                          $Array3d[0][0][1] = 16;
                                      
                          $rootgroup 16;
                                      
                          $sendY 2;
                                  }
                                  else {
                                   
                                          while (
                          $result mysql_fetch_array($query)) {
                                                  if (
                          $result["rootgroup_id"] == $rootgroup) {
                                                                  if (
                          $firstflag == 0) {
                                                                       switch (
                          $counter) {
                                                                            case 
                          1:
                                                                              
                          $sendY 2;
                                                                              
                          $sendX 1;
                                                                              
                          $firstflag 1;
                                                                              break;
                                                                          case 
                          2:
                                                                              
                          $sendY $y;
                                                                              
                          $sendX 1;
                                                                              
                          $firstflag 1;                                                    
                                                                              break;
                                                                          case 
                          3:
                                                                              
                          $sendY $y;
                                                                              
                          $sendX $x;
                                                                              
                          $z 1;
                                                                              
                          $firstflag 1;
                                                                              break;
                                                                          }
                                                                  }
                                                                           
                          $Array3d[$y][$x][$z] = $result["group_id"];   
                                                                          echo 
                          "groupId" $Array3d[$y][$x][$z] . "groupid";
                                                                          switch (
                          $counter) {
                                                                              case 
                          1:    
                                                                          
                          //        $Array3d[$y][$x][$z] = $result["group_id"];                                                           
                                                                                  
                          ($y++);
                                                                                  
                          $saveY $y;
                                                                                  break;
                                                                              case 
                          2:
                                                                                  
                                                                                  (
                          $x++);
                                                                                  break;
                                                                              case 
                          3:
                                                                          
                          //        if ($xPoscount[$sendY] =! 0) {                
                                                                           //           $Array3d[$y][$x][$z] = $result["group_id"];                                                           
                                                                          //        }    
                                                                                  
                          echo "dasz" $z;
                                                                                  (
                          $z++);
                                                                                  break;
                                                                              }
                                                }
                                          }
                                   }
                                  switch (
                          $counter) {
                                      case 
                          0:
                                          (
                          $counter++);
                                          break;
                                      case 
                          1:
                                          (
                          $counter++);
                                          
                          $rootgroup $Array3d[$sendY][0][$z];                     
                                          break;
                                      case 
                          2:
                                          
                          $xPoscount[$sendY] = $x 1;
                                          echo 
                          "pos" $xPoscount[$sendY];
                                          (
                          $sendY++);
                                          echo 
                          "case2" $sendY;
                                          
                                          
                          $rootgroup $Array3d[$sendY][0][$z]; 
                                          if (
                          $sendY  $saveY) {
                                              (
                          $counter++);
                                              
                          $sendY 1;
                                              
                          $rootgroup $Array3d[1][1][0];
                                          }                    
                                          break;
                                      case 
                          3:
                                          (
                          $sendX++);
                                          if (
                          $sendX $xPoscount[$sendY]) {
                                              (
                          $sendY++);    
                                              
                          $sendX 1;
                                          }
                                          echo 
                          "<br>" $sendY " und " $sendX;
                                          
                          $rootgroup $Array3d[$sendY][$sendX][0];
                                          if ((
                          $sendY 2) > $saveY) {
                                              (
                          $counter++);    
                                          }
                                          break;                    
                                  }      
                          //        mysql_free_result($query);
                          //        ($counter++);
                          //        echo $counter;
                                  
                          if ($counter 4) {
                                      
                          FfillGroup($sendY$sendX$z$counter$rootgroup0$Array3d$saveY$xPoscount);
                                  }
                                  else {
                                      return 
                          $Array3d;
                                  }
                          }
                              
                                  
                                  
                                  
                                  global 
                          $Array3d;     
                          //        $test = initarray();
                          //        $Array3d = $test;        
                                  
                          $Array3d = array();
                                          
                                  
                                  
                          $xPoscount = array();    
                                  
                          FfillGroup(0,0,0,0,0,0,$Array3d,0,$xPoscount);
                          //      echo $dArray[1][0][0];
                                  
                          echo $Array3d[0][0][0];
                                  echo 
                          $Array3d[1][0][0];
                                  echo 
                          $Array3d[2][0][0];
                                  echo 
                          $Array3d[3][0][0];
                                  echo 
                          $Array3d[4][0][0] . "\n";
                                  echo 
                          $Array3d[1][1][0];
                                  echo 
                          $Array3d[1][2][0];
                                  echo 
                          $Array3d[1][3][0];
                                  echo 
                          $Array3d[1][4][0];
                                  echo 
                          $Array3d[1][5][0] . "\n";
                                  echo 
                          $Array3d[2][1][0]; 
                                  echo 
                          $Array3d[2][2][0] . "\n";
                                  
                                  
                                  echo 
                          $Array3d[3][1][0] . "\n";

                                  
                                  echo 
                          $Array3d[3][2][0];
                                  echo 
                          $Array3d[3][3][0] . "\n";
                                  
                                  echo 
                          $Array3d[4][1][0];
                                  echo 
                          $Array3d[4][2][0];
                                  echo 
                          $Array3d[4][3][0] . "\n";                                

                                  echo 
                          $Array3d[4][1][1];
                                  echo 
                          $Array3d[4][1][2];
                                  echo 
                          $Array3d[4][1][3];
                                  echo 
                          $Array3d[2][2][2];
                                  
                                  
                                  
                          print_r($Array3d);
                          ?>

                          <br>
                          </body>

                          </html> 

                          Kommentar

                          Lädt...
                          X