Ankündigung

Einklappen
Keine Ankündigung bisher.

list() und die verschluckte Variable

Einklappen

Neue Werbung 2019

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

  • list() und die verschluckte Variable

    Hallo,

    was erwartet ihr bei folgendem Konstrukt für eine Ausgabe?
    PHP-Code:
    <?php
    echo '<pre>';
    var_dump($collation);
    list (
    $characterSet$collation$compare) = $collation;
    var_dump($characterSet$collation$compare);
    echo 
    '</pre>';
    ?>
    (man beachte 2x $collation)

    Doch eigentlich das hier:
    Code:
    array(3) {
      [0]=>
      string(4) "utf8"
      [1]=>
      NULL
      [2]=>
      string(3) "bin"
    }
    
    string(4) "utf8"
    NULL
    string(3) "bin"
    Lustigerweise kommt aber das hier heraus:
    Code:
    array(3) {
      [0]=>
      string(4) "utf8"
      [1]=>
      NULL
      [2]=>
      string(3) "bin"
    }
    
    NULL
    NULL
    string(3) "bin"
    Man beachte, dass $characterSet NULL ist. Das Problem liegt in der Variablen $collation, die ich zweimal für die Zuweisung verwende, einmal in list() und einmal bei der Zuweisung rechts von =

    Aber warum ist dann $characterSet NULL?

  • #2
    hm... vllt wird das list von hinten nach vorn abgewickelt, und beim zweiten wird $collation einfach mit dem neuen Wert überschrieben und futsch ist das Array.
    Ich würde daher das erstere auch nicht unbedingt als "erwartbar" bezeichnen

    Kommentar


    • #3
      list() wertet die angegebenen Werte von Rechts nach Links aus. Also $compare wird der 2te Array Eintrag -> "bin". Dann komm $collation, das wird zum 1ten Array Eintrag, also "null". Da nun $collection null ist wird auch $characterSet zu null.

      Beitrag editiert:
      Siehe auch die Warning im Handbuch:
      http://php.net/manual/en/function.list.php

      Kommentar


      • #4
        Also so ein bissl pervers ist list() dann aber schon.

        list ($eins, $zwei) = null;
        [keine Fehlerausgabe]

        list ($eins, $zwei) = array(1);
        [Undefined offset: 1]

        Vor allem warum denn nun 1, wenn es angeblich von hinten ausgeführt wird (array_pop)? Verstehe dann die Warnung im Zusammenhang mit der Ausgabe nicht.

        Na ich geh besser schlafen, danke euch beiden, werd mir vlt. morgen dann aufn Schädel klatschen und ne Erleuchtung haben =)

        Kommentar


        • #5
          Ich mag list() überhaupt nicht. Ich find das "herzaubern" von Variablen irgendwie nicht schön. Ich nutz list() daher nie.

          Kommentar


          • #6
            Zitat von Flor1an Beitrag anzeigen
            Ich mag list() überhaupt nicht. Ich find das "herzaubern" von Variablen irgendwie nicht schön. Ich nutz list() daher nie.
            ich seh in dem list() auch nicht wirklich den Sinn. Falls ich schon ein Array habe, wozu soll ich das denn noch wieder auf einzelne Variablen aufteilen? Kann ich doch gleich den entsprechenden Array benutzen..

            Kommentar


            • #7
              Ich finds eigentlich ganz gut zwecks Lesbarkeit.

              Kommentar


              • #8
                Zitat von Flor1an Beitrag anzeigen
                Ich mag list() überhaupt nicht. Ich find das "herzaubern" von Variablen irgendwie nicht schön. Ich nutz list() daher nie.
                Es wird nichts herbeigezaubert ...
                List() ist eine Krücke aus der Zeit, als PHP noch das Perl für Arme sein wollte. Weil es soetwas wie Perls "list values" oder "list assignments" in PHP nicht gibt, kann man nicht
                PHP-Code:
                $inode stat($file)[1]; 
                oder
                PHP-Code:
                ($device$inode$mode) = stat($file); 
                schreiben. Dafür hat man eben list() als schlechten Ersatz:
                PHP-Code:
                list ($device$inode$mode, ) = stat($file); 
                Aber das wird alles besser in PHP6^H5.4 ...

                Kommentar


                • #9
                  Zitat von fireweasel Beitrag anzeigen
                  Weil man damals in PHP nicht
                  $inode = stat($file)[1];
                  schreiben konnte, gab es eben list() als schlechten Ersatz:
                  list (, $inode, ) = stat($file);
                  Interessant. Aber obwohl der direkte Array-Zugriff auf Rückgabewerte immer noch nicht funktioniert, ist dieser Gebrauch von list mir noch nie untergekommen. Schön ist das doch auch nicht...

                  Kommentar


                  • #10
                    Ich finde die Funktion jetzt nicht weiter schlimm und würde sie benutzen wenn es nötig oder vorteilhaft wäre. Eine solche Situation ist mir bisher aber noch nie untergekommen.

                    Kommentar


                    • #11
                      Ich mag sie deswegen nicht weil du nicht erkennen kannst welcher Wert im Array jetzt wo steht. Angenommen die Reihenfolge im Array verändert sich ist list() auch kaputt. Da geh ich lieber den Umweg über eine weitere Variable kann dann aber sicher gehen das die richtigen Indize genutzt werden und auch die richtigen Werte ausm Array genutzt werden.

                      Kommentar


                      • #12
                        Das ist natürlich ein Nachteil. Mir fällt auch kein sonderlich sinnvolles Beispiel ein bei dem die Reihenfolge der Elemente eine Rolle spielt, diese aber keine benannten Schlüssel haben und die dann trotzdem bestimmten Variablen zugeordnet werden können.

                        Kommentar


                        • #13
                          Zitat von Flor1an Beitrag anzeigen
                          Ich mag sie deswegen nicht weil du nicht erkennen kannst welcher Wert im Array jetzt wo steht. Angenommen die Reihenfolge im Array verändert sich ist list() auch kaputt. ...
                          Die gängigen Anwendungen holen Einzelwerte aus Funktionen, die nur Arrays zurückgeben. Deren Schlüssel-Wert-Zuordnung ist festgelegt (oder festlegbar). Auf die Schnelle fallen mir jetzt debug_backtrace() und unpack() ein.

                          PHP-Code:
                          list ($me$caller, ) = debug_backtrace();
                          // den Rest brauchen wir nicht 
                          PHP-Code:
                          // flip endianess
                          $little 0xFFFE;
                          list (, 
                          $big) = unpack('N'pack('V'$little)); 
                          Ich wüsste jetzt nicht, wie ich sowas ohne list() einfacher, eleganter, verständlicher ... schreiben könnte.

                          Kommentar


                          • #14
                            Ich mag sie deswegen nicht weil du nicht erkennen kannst welcher Wert im Array jetzt wo steht. Angenommen die Reihenfolge im Array verändert sich ist list() auch kaputt.
                            Versteh ich nicht, das Argument. Ist doch bei allen Arrayzugriffen so, wenn sie nicht gerade assoziativ sind.

                            Ich finde list tw. ganz praktisch, bspw. wenn man aus csv-Dateien performant nur bestimmte Spalten auswerten möchte.

                            Kommentar

                            Lädt...
                            X