Klaus Stein: Foreach-Schleife kennt Variable nicht mehr

Hallo und großes 'Juchhu', dass das Forum wieder läuft!!!

  
<?php  
function durchlauf($datei, $zeiger, $arr_res_query)  
{  
foreach ($datei AS $zeile)  
  {  
  $zeile_temp = str_replace(" ", "", $zeile);  
  while (list($result, $query)=each($arr_res_query))  
     {  
     echo("$zeile_temp<br />");  
     }  
   }  
}  
$datei=file("ex_sammler_alt.php");  
  
$arr_res_query['result1'] = "query1";  
$arr_res_query['result2'] = "query2";  
$arr_res_query['result3'] = "query3";  
  
$test = durchlauf($datei,'0',$arr_res_query);  
?>  

Echo gibt nichts aus, also ist die Variable $zeile_temp unbekannt.

Unterbricht denn meine while-Schleife den Geltungsbereich einer zuvor bekannten variable?

Grüße, Klaus

  1. Tach!

    Echo gibt nichts aus, also ist die Variable $zeile_temp unbekannt.

    Wenn das echo nichts ausgibt, wird es nicht ausgeführt. Zumindest die <br>s sollten sonst in der Ausgabe landen.

    Unterbricht denn meine while-Schleife den Geltungsbereich einer zuvor bekannten variable?

    Nein. Überprüf doch mal deine anderen Variablen (mit var_dump()) ob sie das enthalten, was du erwartest.

    dedlfix.

    1. Hi dedlfix,

      Wenn das echo nichts ausgibt, wird es nicht ausgeführt. Zumindest die <br>s sollten sonst in der Ausgabe landen.

      Ja doch. Tun sie auch. ich hatte nur auf den Ausgabeschirm gachtet, da tauchte es aber nicht auf, weil die erste zeile (<php?) interpretiert wurde.

      Nein. Überprüf doch mal deine anderen Variablen (mit var_dump()) ob sie das enthalten, was du erwartest.

      Aber sie scheint meine foreach-Schleife zu unterbrechen, denn sie erzeugt eine 3-fache Ausgabe der 1.zeile und danach ist dann Schluss.

      Klaus

      1. Aber sie scheint meine foreach-Schleife zu unterbrechen, denn sie erzeugt eine 3-fache Ausgabe der 1.zeile und danach ist dann Schluss.

          
        <?php  
        function durchlauf($datei, $zeiger, $arr_res_query)  
        {  
        foreach ($datei AS $zeile)  
          {  
          $zeile_temp = str_replace(" ", "", $zeile);  
          $zeile_temp2 = zeilendurchlauf($zeile, $arr_res_query);  
           }  
         }  
          
        function zeilendurchlauf($zeile_temp, $arr_res_query)  
        {  
          while (list($result, $query)=each($arr_res_query))  
             {  
             echo("Zeile: ".$zeile_temp."<br /><br />");  
             }  
        	 return;  
        }  
          
        $datei=file("alt.php");  
          
        $arr_res_query['result1'] = "query1";  
        $arr_res_query['result2'] = "query2";  
        $arr_res_query['result3'] = "query3";  
          
        $test = durchlauf($datei,'0',$arr_res_query);  
        ?>  
        
        

        Wenn ich es so umbaue, dann macht die Funktion genau, was ich will, nämlich jede Zeile des Arrays $datei genau sooft ausgeben, wie es Elemente im Array $arr_res_query gibt.

        Das ermöglicht mir dann, weitere Operationen mit $zeile_temp und dem jeweiligen Arrayelement durchzuführen.

        Aber warum ging es in der while-Schleife nicht?

        1. Tach!

          Aber warum ging es in der while-Schleife nicht?

          while-list-each ist ja fast daselbe wie foreach, aber eben nicht ganz. Der Unterschied ist, dass foreach beim übergebenen Array immer von vorn beginnt durchzulaufen, während each() nur den internen Array-Zeiger eins vorstellt. Und am Arrayende? Wird er nicht von selbst zurückgestellt. (Das war mir bei der ersten Antwort noch nicht wieder eingefallen.) Der nächste while-Start beginnt also mit einem auf dem Ende von $arr_res_query stehenden Array-Zeiger.

          Nimm einfach zwei geschachtelte foreach. Für das while-list-each-Konstrukt gibt es heutzutage kaum noch eine Notwendigkeit.

          dedlfix.

          1. Aber warum ging es in der while-Schleife nicht?

            Und am Arrayende? Wird er nicht von selbst zurückgestellt. (Das war mir bei der ersten Antwort noch nicht wieder eingefallen.) D

            Ah, ok. Dann hatte ich ja den richtigen Riecher, dass die while schleife meine foreach beendet.

            Nimm einfach zwei geschachtelte foreach. Für das while-list-each-Konstrukt gibt es heutzutage kaum noch eine Notwendigkeit.

            Gibt es denn einen anerkannt "besten" Weg (oder gar eine fertige Funktion) ein assoziatives Array ueber geschachtelte foreach schleifen nach Key und Value aufzudroeseln?

            Klaus

            1. Tach!

              Ah, ok. Dann hatte ich ja den richtigen Riecher, dass die while schleife meine foreach beendet.

              Nein, macht sie nicht. Setz mal als erste Anweisung innerhalb der foreach-Schleife ein var_dump($zeile); dann siehst du alle Zeilen deiner Datei, aber nur nach der ersten Zeile den Inhalt von $arr_res_query. foreach läuft also durch, nur das while hat ab dem zweiten Durchlauf nichts mehr zu tun.

              Gibt es denn einen anerkannt "besten" Weg (oder gar eine fertige Funktion) ein assoziatives Array ueber geschachtelte foreach schleifen nach Key und Value aufzudroeseln?

              foreach($array as $content)
              foreach($array as $key => $content)

              Das sind die beiden Varianten. Vielleicht fehlte dir ja nur die zweite.

              dedlfix.

              1. foreach($array as $key => $content)

                Das sind die beiden Varianten. Vielleicht fehlte dir ja nur die zweite.

                Hi dedlfix,

                ja, so ist es.
                Danke,
                Klaus