Was ist der Zweck? Finden Sie den Prozess
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>
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>
Die Ergebnisse sind wie folgt
<code class="php">2 5 0=>1 1=>2 2=>3 3=>4 4=>5 </code>
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
während der Ausführung von FETCH OPCODE.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
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
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>