Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] foreach zeigt auf falsche Werte

Einklappen

Neue Werbung 2019

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

  • [Erledigt] foreach zeigt auf falsche Werte

    Hallo Community,

    ich habe ein Problem mit einer foreach-Schleife.
    Ich habe einen multidimensionalen assoziativen Array $result.
    Wenn ich mit den Array mit print_r ausgeben lasse, sind alle Daten am richtigen Ort, wenn ich allerdings anschließend mit einer foreach Schleife über den Array gehe, dann gibt mit der letzte Eintrag die vorletzen Werte aus. Das ist ein sehr merkwürdiges Verhalten, da ja alles am richtigen Platz zu sein scheint. Ist jemandem sowas schon untergekommen?
    Ich kann leider meinen Code nicht posten, weil es sich um Unternehmenscode handelt und habe es auch noch nicht hinbekommen, den Fehler anderweitig zu reproduzieren. Nochmal kurz, was passiert:
    PHP-Code:
    $result = array("t1" => array(1,2), "t2" => array(3,4), "t3" => array(5,6)); 
    wenn ich jetzt
    PHP-Code:
    print_r($result
    mache, stimmt alles. Wenn ich anschließend foreach mache
    PHP-Code:
    foreach($result as $key => $val) {echo $keyprint_r($val) } 
    sieht die Ausgabe aber so aus:
    t1 Array (1,2)
    t2 Array (3,4)
    t3 Array (3,4)
    Als hotfix habe ich bisher nur
    PHP-Code:
    foreach(array_keys($result) as $key) {
    $val $result[$key];
    //jetzt stimmt alles


  • #2
    Zitat von Optimum Beitrag anzeigen
    Ich kann leider meinen Code nicht posten, weil es sich um Unternehmenscode handelt und habe es auch noch nicht hinbekommen, den Fehler anderweitig zu reproduzieren.
    Dann wirst du den Fehler wohl selbst durch auskommentieren/Debugausgaben eingrenzen müssen (evtl. wird irgendwo was überschrieben?) - sorry, Glaskugeln sind leider recht unzuverlässig und müsen ständig in die Reinigung ...

    Kommentar


    • #3
      Off-Topic: Meine Glaskugel strahlt grad vor Sauberkeit..

      Solche "Fehler" entstehen oft durch unsachgemäße Benutzung von Referenzen.

      Hier der Code, welcher deinen Fehler reproduziert.

      LG jspit

      Kommentar


      • #4
        Zitat von Optimum Beitrag anzeigen
        Ich kann leider meinen Code nicht posten, weil es sich um Unternehmenscode handelt
        Dann handelt es sich auch um ein Unternehmensproblem, wenn du kein Beispiel liefern kannst, in dem das gleiche Problem vorkommt.

        Kommentar


        • #5
          Zitat von tk1234 Beitrag anzeigen
          Dann wirst du den Fehler wohl selbst durch auskommentieren/Debugausgaben eingrenzen müssen (evtl. wird irgendwo was überschrieben?)
          Das ist das Problem, da ist nichts, was ich auskommentieren kann. Zeile 1: alles funktioniert, Zeile 2: Fehler

          Zitat von jspit Beitrag anzeigen
          Solche "Fehler" entstehen oft durch unsachgemäße Benutzung von Referenzen.
          Hier der Code, welcher deinen Fehler reproduziert.
          Vielen Dank dafür. Wodurch wird dieses Verhalten verursacht? Hatte das bisher eigentlich noch nie und habe meine Arrays immer mit $key => $val und nicht mit $key => &$val durchlaufen.

          Kommentar


          • #6
            Mach mal vor der Schleife welche den Fehler produziert testhalber ein
            PHP-Code:
            unset($val); 
            Wenn dies Wirkung zeigt, nicht als Workaround benutzen sondern die Ursache suchen!

            Kommentar


            • #7
              Ok, habs mal in dem Minimalbeispiel getestet und da zeigt es Wirkung, $val hat also ein Problem damit, dass es vorher mal als Referenz benutzt wurde. Von Referenzen habe ich aber leider noch nicht so die Ahnung, deswegen hören da meine Debugging-Fähigkeiten auf.

              Offensichtlich habe ich aber auch den Scope von PHP überschätzt. Ich dachte, foreach hat einen eigenen Scope wie bei Java.

              Kommentar


              • #8
                Vermute ich richtig, du werkelst da in einem Code der nicht von dir ist?
                Warum nimmst du nicht anstelle der Allerweltsbezeichnung $var in deiner Schleife einen sinnvollen Bezeichner?

                Kommentar


                • #9
                  Doch, der Code ist von mir. Ich habe einen Array, den ich mit Werten aus einer Datenbank fülle und hatte dort eine Referenz als Abkürzung eingeführt, weil ich das ganz praktisch fand und so nicht jedesmal wieder die Arrayposition raussuchen lassen muss. So habe ich nicht jedesmal $result[$row[0]][$key], sondern mache einmal $ref = &$result[$row[0]] und kann dann mit $ref[$key] den Array befüllen. Aber vielleicht sollte man das nicht machen.
                  Ich verwende aber irgendwie meistens allgemeine Bezeichner, vor allem wenn ich Arrays durchlaufe.

                  Aber zurück zum Problem: Warum tritt das denn auf? Welchen Einfluss hat es auf $val, dass es mal eine Referenz war? Oder muss ich hierbei in die Implentierung von foreach reinschauen, um das Verhalten zu verstehen?

                  Kommentar


                  • #10
                    Ok, jetzt wo ich weiß, wonach ich suchen muss, habe ich eine Seite gefunden, in der das Verhalten sehr gut erklärt wird:
                    http://schlueters.de/blog/archives/1...d-foreach.html
                    Dann muss ich wohl wirklich unset() oder gleich Referenzvariablen nur für Referenzen einführen.

                    Kommentar


                    • #11
                      Es ist übrigens überraschenderweise echt hilfreich, ein lokal testbares Beispiel zu zeigen, das das Problem zeigt.

                      Kommentar


                      • #12
                        Das ist mir schon klar, hab ich versucht, aber ich hab den Fehler nicht reproduziert bekommen. Dankenswerter weise gab es ja einen Nutzer, der wusste, worum es geht und schnell ein Minimalbeispiel geschrieben hat.

                        Kommentar

                        Lädt...
                        X