2012-12-02 18 views
6

Blick auf diese:php-Taste() in foreach-Schleife seltsame Verhalten oder bekommen den nächsten Schlüssel in foreach-Schleife

<?php 
    $array = array('a' => '…', 'b' => '…', 'c' => '…', 'd' => '…', 'e' => '…', 'f' => '…'); 
    foreach ($array as $key => $val){ 
     echo "current key: $key, next key: ".key(($array))."<br>"; 
    } 
?> 

OUTPUT:

current key: a, next key: b 
current key: b, next key: c 
current key: c, next key: d 
current key: d, next key: e 
current key: e, next key: f 
current key: f, next key: a 

ich für eine Funktion war auf der Suche erhalten die nächster Schlüssel eines assoziativen Arrays innerhalb einer foreach-Schleife. Ich habe es ein bisschen versucht und plötzlich hat es funktioniert. (wie Sie in meinem Beispiel sehen können).

ABER WARUM FUNKTIONIERT DIESES? Macht das Sinn? ... nicht zu mir! Kannst du mir das erklären?

Es ist wegen der key(($array)) Teil aber warum? ich meine .. es war ein Fehler .. Ich wollte key($array) schreiben, aber ich habe vergessen, die 2 Klammern zu löschen. Also war es Zufall !!!

Warum verhält es sich so? Ich meine, es ist gut, aber ... ????

+3

Interessant. Wenn Sie die Fehlerberichterstattung aktivieren, werden viele Fehler angezeigt. Die zusätzlichen Klammern brechen die direkte Variablenreferenz. '$ a' ist eine Variable,' ($ a) 'ist ein Ausdruck, der zum * Wert * von' $ a' führt. 'key' erwartet eine Variable, die als Referenz übergeben wird. Ich bin mir nicht sicher, was genau 'key' damit macht und warum es sich verhält, aber ich würde dies unter falschem undefiniertem Verhalten ablegen. – deceze

+1

whoa, wenn das Verhalten super ist. Es gab so viele Male, dass ich so etwas hätte verwenden können. –

+0

aber was schlägst du vor? soll ich es so halten? –

Antwort

4

Entsprechend dem PHP-Handbuch für key, gibt key() das Indexelement der aktuellen Array-Position zurück.

Das Problem ist nicht so sehr mit key oder sogar mit den doppelten Klammern. Key empfängt das Array als Referenz, sodass die doppelten Klammern nicht viel bewirken.

Das Verhalten kommt von foreach. Wenn foreach durch das Array iteriert, verhalten sich verschiedene PHP-Versionen beim Festlegen des internen internen current-Zeigers des Arrays unterschiedlich, was sich bei dem Aufruf der key(), , current() usw. ergibt.

Arrays in PHP sind in den meisten Sprachen nicht wie Arrays; Sie sind wirklich Objekte (insbesondere assoziative Arrays). Denken Sie an sie irgendwie wie verkettete Listen (sie sind nicht verbundene Listen, aber gehen Sie einfach mit mir für Illustrationszwecke) - wenn Sie durchlaufen, müssen Sie wissen, wo Sie zurzeit sind und wo Sie als nächstes sein werden.

Was offensichtlich ist hier passiert ist, dass auf, was PHP-Version Sie ausführen, foreach wird die internen current Zeiger auf das bei next Elemente Einstellen des Anfangs der for-Schleife, unmittelbar nach dem $key und $value Variablen Einstellung in dein Code.

Ich würde definitiv nicht von diesem Verhalten abhängen, wie nachfolgende Updates zu PHP diesen Code brechen können. Es ist nur ein lustiger Zufall dieser speziellen Version. Wenn Sie den nächsten Schlüssel wünschen, schauen Sie sich Ihren foreach Loop an. Das PHP-Handbuch auf next() hat gute Beispiele, und stellen Sie sicher, auch prev(), each(), und die anderen Funktionen im Abschnitt "Siehe auch".

+0

+100, auf jeden Fall eine nette Antwort. –