PHP Referenzen in foreach Schleife

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

  • PHP Referenzen in foreach Schleife

    Hallo zusammen!

    Da ich gerade dabei bin mir PHP anzueignen, lese ich mir so einige Tutorials bzw. Anleitungen durch und da bin ich eine Äußerung gestoßen mit der ich nichts anzufangen weiß. Es wird in einem Tutorial zum Thema Arrays davon gesprochen, dass man die Daten eines Arrays nur dann in einer foreach Schleife bearbeiten kann, wenn man mit "Referenzen" arbeitet.

    Ich weiß jedoch nicht was eine Referenz ist und die offizielle Beschreibung ist auch mehr als mau. Daher meine Frage: Was ist eine Referenz in bezug auf PHP bzw. eine foreach Schleife?

    Gruß
    Jens

  • #2
    PHP-Code:
    $original 1;
    $kopie $original;
    $referenz =& $original;

    echo 
    $original;
    // 1

    echo $kopie;
    // 1

    echo $referenz;
    // 1

    $kopie 2;
    $referenz 3;

    echo 
    $original;
    // 3

    echo $kopie;
    // 2

    echo $referenz;
    // 3 

    Kommentar


    • #3
      Vielen Dank h3ll! Manchmal sagt code mehr als 1000 Worte

      Kommentar


      • #4
        PHP Referenzen in foreach Schleife
        Dazu habe ich gerade einen lustigen Thread gefunden!
        foreach und referenzierung? - SELFPHP Forum

        hier mal mein Testcode:
        PHP-Code:
        <?php
        error_reporting
        (-1);
        ini_set('display_errors'TRUE);
         

        $filme = array('film1''film2'"film3"); 

        var_dump($filme); 
        echo 
        "<br />";

        foreach (
        $filme as &$film
          
        $film ucfirst($film); 

        var_dump($filme); 

        echo 
        "<br />";
        foreach (
        $filme as $key=>$film
          echo 
        "$key $film <br />";
        ?>
        Wir werden alle sterben

        Kommentar


        • #5
          das kann sich eigentlich nur darauf beziehen, wenn man Werte des Array manipulieren will und wieder im Array ablegen will.. meine eigene Erfahrung sagt

          foreach($array as $key=>$element) {
          ...

          }
          reicht meist aus

          und da seh ich keine Referenz
          [font=Verdana]
          Wer LESEN kann, ist klar im Vorteil!
          [/font]

          Kommentar


          • #6
            Was du da siehst, ist mir egal .....

            Was ich da sehe:
            Da wurde ein Feature eingeführt, welches nicht richtig funktioniert. Und anstatt es zu reparieren, wurde es im Handbuch dokumentiert.

            Der blanke Wahnsinn!
            Und was ist, wenn das letzte Element noch gebraucht wird?
            Da gibts dann nur einen Weg: Erst einen Dummy ans Array dran kleben und nach der Schleife wieder löschen.
            Pfusch!
            Pfusch!
            Pfusch!
            (da könnte ich mich noch Stunden drüber aufregen)


            array_(map/walk) ist auch nicht immer der schönste Weg.







            "
            Wir werden alle sterben

            Kommentar


            • #7
              *nix*
              Zuletzt geändert von h3ll; 22.08.2010, 10:22.

              Kommentar


              • #8
                aber hell .. sollte in deinem ersten Codeschnipsel

                $filme[$i]=ucfirst($filme[$i]);

                auch tun?
                [font=Verdana]
                Wer LESEN kann, ist klar im Vorteil!
                [/font]

                Kommentar


                • #9
                  Nein, das sehe ich anders. "Funktioniert nicht richtig" ist falsch, es gibt nichts zu reparieren. Das Feature (foreach) hat gewisse Seiteneffekte, die im Manual dokumentiert sind. Diese Effekte nimmt man in Kauf, um die Ausführungsgeschwindigkeit hoch zu halten. Wenn du mit den Effekten nicht leben kannst, führe vor jedem foreach ein reset($filme) aus und nach dem foreach ein unset($film).
                  Anders ausgedrückt: Die PHP-Entwickler haben das Aufräumen nach dem foreach nicht implementiert, so dass es dem Anwender überlassen bleibt. Damit kann er selbst entscheiden, ob ihm Performance oder "Sauberkeit" wichtiger ist.
                  C-Programmierer kennen das, die müssen immer selber aufräumen. ;-)

                  Kommentar


                  • #10
                    PHP-Code:
                    $filme[$i]=ucfirst($filme[$i]); 
                    Na klar tuts das!

                    Aber nichts desto Trotz:
                    Wenn man schon Referenzen in Foreach einführt, dann sollte man das richtig machen.
                    Und nicht so was kaputtes produzieren.
                    Manchmal verstehe ich die PHP Entwickler nicht.

                    aus und nach dem foreach ein unset($film)
                    wenn ich die Daten in der Schleife verändere, dann will ich danach noch damit weiter arbeiten.
                    Sonst bräuchte ich sie ja nicht darin zu veränden.

                    Die PHP-Entwickler haben das Aufräumen nach dem foreach nicht implementiert, so dass es dem Anwender überlassen bleibt. Damit kann er selbst entscheiden, ob ihm Performance oder "Sauberkeit" wichtiger ist.
                    C-Programmierer kennen das, die müssen immer selber aufräumen. ;-)
                    Schöne Argumente...
                    Nur sind wir hier nicht in C..
                    Mal abwarten, was uns die PHP Entwickler, mit solchen oder ähnlichen Argumenten, noch so alles unterjubeln.
                    Zuletzt geändert von combie; 22.08.2010, 10:38.
                    Wir werden alle sterben

                    Kommentar


                    • #11
                      Zitat von combie Beitrag anzeigen
                      wenn ich die Daten in der Schleife verändere, dann will ich danach noch damit weiter arbeiten.
                      Sonst bräuchte ich sie ja nicht darin zu veränden.
                      Das unset() wird benutzt um die Referenz auf den letzten Arrayeintrag zu zerstören. Der Eintrag selbst bleibt davon unberührt.
                      Wären Referenzen in foreach so implementiert wie du es dir wünscht, gäbe es diese Referenz gar nicht mehr. In diesem Sinne macht dieses unset() nichts kaputt sondern ganz.

                      Ich gebe zu, dass es nicht ganz zur Sprache passt, wie die Entwickler das umgesetzt haben. Aber mal ehrlich, wer in foreach mit Referenz arbeitet, der ist ein Pro und weiß was er tut. Solche Leute können auch mit den Nebenwirkungen umgehen, sollte man meinen.

                      Kommentar

                      Lädt...
                      X