Heim >Backend-Entwicklung >PHP-Tutorial >Lösen Sie, warum das foreach-Schleifenarray den Zeiger nur einmal an die zweite Position bewegt.
$countries = [
<code> [ '0' => [ 'id' =>0 ] ], [ '1' => [ 'id' =>1 ] ], </p> <p>];<br>foreach ($countries as $key => $value) {</p> <pre class="brush:php;toolbar:false"><code>print_r(current($countries)); echo '下一个'; print_r(pos($countries)); next($countries); echo PHP_EOL; </code>
}
?>
$countries = [
<code> [ '0' => [ 'id' =>0 ] ], [ '1' => [ 'id' =>1 ] ], </p> <p>];<br>foreach ($countries as $key => $value) {</p> <pre class="brush:php;toolbar:false"><code>print_r(current($countries)); echo '下一个'; print_r(pos($countries)); next($countries); echo PHP_EOL; </code>
}
?>
Das definierte $countries
und das $countries
in der foreach-Schleife zeigen auf dieselbe zval-Variable, da PHP Speicher sparen möchte und dieselben Daten nicht zweimal speichern muss. Zu diesem Zeitpunkt ist refcount
in zval 2. Wenn jedoch $countries
beispielsweise in der Schleife geändert wird, ist
<code class="php"> foreach ($countries as &$country) { $country = 'china'; //因为这里进行了赋值操作, 这里发生了copy-on-write }</code>
oder
<code class="php">foreach ($countries as $country) { echo current($countries); //因为current是要传引用的, 这里发生了copy-on-write }</code>
übergibt eine Referenz und weist einen Wert zu, um den copy-on-write
-Vorgang auszulösen, bei dem es sich um eine Kopie beim Schreiben handelt. Der zval wird kopiert und der ursprüngliche zval wird um 1 reduziert. refcount
, sodass jedes Mal, wenn current einen neuen zval ausführt.copy-on-write
Suche nach dieser Antwort