Warum muss PHP foreach für den Betrieb ein Array kopieren?

WBOY
Freigeben: 2016-08-18 09:16:29
Original
1199 Leute haben es durchsucht

Was ist der Zweck? Finden Sie den Prozess

Antwortinhalt:

Was ist der Zweck? Finden Sie den Prozess

Was meinst du? Verzeihen Sie meine Unwissenheit, aber was meinen Sie?

PHP foreach muss kein Array kopieren, um zu funktionieren. Wo haben Sie gesehen, dass Sie ein Array kopieren müssen?

PHP foreach durchläuft eine Kopie des Arrays. Ich denke, dass dies wahrscheinlich dazu dient, eine Endlosschleife zu vermeiden, die durch das Ändern (Hinzufügen von Elementen) während des Durchlaufens verursacht wird.
Nur ​​eine Vermutung. . .

Als der Fragesteller die interne Implementierung von foreach wissen wollte, kopierte er ein 临时变量 für den Betrieb, anstatt das eigentliche Array zu betreiben

Ich war immer verwirrt über diese Frage. Die folgende Antwort dient nur als Referenz, haha

Referenz: Detailliertes Verständnis des PHP-Kernels

<code> [鸟哥的php foreach](http://www.laruence.com/2008/11/20/630.html)
 </code>
Nach dem Login kopieren

Sehen wir uns ein Beispiel an, um zu beweisen, dassforeach tatsächlich ein 临时变量 kopiert wird, um in der Schleife zu arbeiten

<code class="php">
$arr = array(1,2,3,4,5);

//该数组的下一元素为 2
echo next($arr);//2

//该数组的最后元素为 5
echo end($arr);//5

//即使上一步调用end将数组指针移到最后一位, 但在foreach开始执行时, 会重置数组指针
foreach($arr as $key => $row) {
    next($arr);
    end($arr);
    echo $key, '=>', $row, "\r\n";//
}
</code>
Nach dem Login kopieren

Die Ergebnisse sind wie folgt

<code class="php">2
5
0=>1
1=>2
2=>3
3=>4
4=>5
</code>
Nach dem Login kopieren

Wie oben, foreach bevor die Schleife beginnt, wird beim Aufruf von next oder end die Position des Array-Zeigers geändert, aber wenn sie innerhalb von foreach aufgerufen wird, bleibt der Schleifenprozess unverändert

Betreiben Sie im durchlaufenen Code den Zeiger des Arrays über end, next usw., und der Zeiger des Arrays ändert sich nicht. Dies liegt daran, dass der interne Zeiger beim Ausführen einer FETCH-Operation vom PHP-Kernel geändert wird Der Wert des aktuell betriebenen Arrays wird in einer Zwischenvariablen gespeichert. Bei jedem Durchlaufen eines Elements wird zuerst die zuvor gespeicherte Zeigerposition abgerufen. Nach dem Abrufen des nächsten Elements wird die Zeigerposition wiederhergestellt Variable

während der Ausführung von FETCH OPCODE.

Hier können Sie sehen, dass das ursprüngliche Array, das foreach von Zeit zu Zeit in der Schleife arbeitet, eine Kopie des ursprünglichen Arrays

ist

Beantworten wir nun die Hauptfrage: Warum müssen wir ein Array kopieren, um es zu bearbeiten, anstatt das ursprüngliche Array zu bearbeiten? Meine Idee ist, wenn foreach das ursprüngliche Array bearbeitet, ändern Sie den Wert des ursprünglichen Arrays in foreach oder neue Elemente hinzufügen, was wird passieren, wenn Sie so darüber nachdenken, werden Sie verstehen,

<code class="php">foreach ($variable as $key => $value) {
    $variable[''] => mt_rand(1, 111);
}</code>
Nach dem Login kopieren
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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!