Das Problem der Verwendung von & für Schlüsselwerte in der foreach-Schleife in PHP

WBOY
Freigeben: 2016-08-04 09:19:49
Original
1309 Leute haben es durchsucht

Der Code lautet wie folgt:

<code>$a = [1, 2, 3];
foreach($a as $key => &$value) {
    $value = 5;
}
var_dump($a);</code>
Nach dem Login kopieren
Nach dem Login kopieren

Das endgültige Ausgabeergebnis ist wie folgt:

<code>array(3) { [0]=> int(5) [1]=> int(5) [2]=> &int(5) }</code>
Nach dem Login kopieren
Nach dem Login kopieren

Frage: Warum erscheint das Adresszeichen vor dem letzten Schlüsselwert?

Antwortinhalt:

Der Code lautet wie folgt:

<code>$a = [1, 2, 3];
foreach($a as $key => &$value) {
    $value = 5;
}
var_dump($a);</code>
Nach dem Login kopieren
Nach dem Login kopieren

Das endgültige Ausgabeergebnis ist wie folgt:

<code>array(3) { [0]=> int(5) [1]=> int(5) [2]=> &int(5) }</code>
Nach dem Login kopieren
Nach dem Login kopieren

Frage: Warum erscheint das Adresszeichen vor dem letzten Schlüsselwert?

Das & in diesem var_dump bedeutet, dass Sie eine andere Variable verwenden können, um ihren Wert zu ändern.
Gefällt dir

<code class="php">$b = &$a[0];
var_dump($a);</code>
Nach dem Login kopieren

Wenn Sie hier drucken, erscheint im ersten Schlüsselwert ein &-Symbol, das darauf hinweist, dass Sie andere Variablen ($b) verwenden können, um seinen Wert zu ändern.

Lassen Sie uns zunächst die grundlegende Verwendung von & verstehen.

<code class="php">$b = $c = 1;
$a = &$b;
$a = 2;
echo "b=$b,c=$c\n";
$a = &$c;
$a = 100;
$a = 200;
echo "b=$b,c=$c\n";
unset($a);
$a = 500;
echo "b=$b,c=$c\n";</code>
Nach dem Login kopieren

Nachdem $a oben als Referenz auf $b angegeben wurde, wird durch die Änderung von $a der Wert des entsprechenden $b geändert, es sei denn, es wird erneut als andere Referenz angegeben oder nicht gesetzt ($a).

Das Gleiche gilt für Ihr foreach. Wenn Sie die Schleife in einzelne Schritte aufteilen, sieht es so aus:

<code class="php">$value = &$a[0];
$value = 5;
$value = &$a[1];
$value = 5;
$value = &$a[2];
$value = 5;</code>
Nach dem Login kopieren

Wenn die Schleife bis zum Ende läuft, ist $value eine Referenz auf $a[2] und entspricht daher dieser Form:

<code class="php">$a[0] = 5;
$a[1] = 5;
$value = &$a[2];
$a[2] = 5;
var_dump($a);</code>
Nach dem Login kopieren

Es ist nicht schwer zu verstehen, warum var_dump ein &-Symbol auf dem letzten Schlüssel-Wert-Paar druckt.


Unter normalen Umständen wird dies keine großen Probleme verursachen, aber aufgrund des Bereichsproblems von foreach kann $value nach Beendigung der Schleife weiterhin verwendet werden, sodass einige unglaubliche Fehler auftreten.

Gefällt mir

<code class="php">$a = [1, 2, 3];
foreach($a as $key => &$value) {
    $value = $value+5;
}
var_dump($a); // [6,7,8]
foreach($a as $value){}
var_dump($a); // [6,7,7]</code>
Nach dem Login kopieren

Nachdem ein leeres foreach hinzugefügt wurde, wird $a unzumutbar. Der Grund liegt auch darin, dass der $-Wert im leeren foreach ein Verweis auf das oberste &a[2] ist.

Das leere foreach entspricht diesem:

<code class="php">$value = &$a[2];
$value = $a[0];
$value = $a[1];
$value = $a[2];</code>
Nach dem Login kopieren

Ist Ihnen aufgefallen, dass das Obige wie folgt umgeschrieben werden kann, da $value eine Referenz auf $a[2] ist:

<code class="php">$a[2] = $a[0];
$a[2] = $a[1];
$a[2] = $a[2];</code>
Nach dem Login kopieren

$a[2] ändert sich ständig im leeren foreach, und da $a[2] zum Wert von $a[1] geworden ist, ist $a[2] = $a[2]; nein Für jede Auswirkung , der Wert ist immer noch $a[1];

Dieser unglaubliche Fehler wird durch den Gültigkeitsbereich der Variablen $value verursacht, daher müssen Sie zuerst entweder den Namen ändern oder $value deaktivieren.

<code class="php">$a = [1, 2, 3];
foreach($a as $key => &$value) {
    $value = $value+5;
}
var_dump($a);
// 要么unset
unset($value);
// 要么foreach里不要用上面同名的$value,改为$value2222
foreach($a as $value2222){}
var_dump($a);</code>
Nach dem Login kopieren

Zuerst möchte ich sagen, dass dies eine sehr, sehrgute Frage ist. Ich glaube, dass der Fragesteller nicht unfähig ist, zwischen Anführungszeichen und Nicht-Anführungszeichen zu unterscheiden.
Ich habe zuerst zwei Tests gemacht:

<code>$a = [1, 2, 3];
foreach($a as $key => &$value) {
    $value = 5;
}
foreach($a as $key => $value) {
    $value = 6;
}
var_dump($a);</code>
Nach dem Login kopieren

Was schätzen Sie als Ergebnis?

<code>array(3) {
  [0]=>  int(5)
  [1]=>  int(5)
  [2]=>  &int(6)
}</code>
Nach dem Login kopieren

Ein weiterer Test ist:

<code>$a = [1, 2, 3];
foreach($a as $key => &$value) {
    $value = 5;
}
foreach($a as $key => $value2) {
    $value2 = 6;
}
var_dump($a);</code>
Nach dem Login kopieren

Die Ausgabe sieht dieses Mal viel normaler aus:

<code>array(3) {
  [0]=>  int(5)
  [1]=>  int(5)
  [2]=>  &int(5)
}</code>
Nach dem Login kopieren

Dieses Problem sollte also eine Falle globaler PHP-Variablen sein.

Verwandte Etiketten:
php
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage