Heim >Backend-Entwicklung >PHP-Tutorial >Lösen Sie, warum das foreach-Schleifenarray den Zeiger nur einmal an die zweite Position bewegt.

Lösen Sie, warum das foreach-Schleifenarray den Zeiger nur einmal an die zweite Position bewegt.

WBOY
WBOYOriginal
2016-08-20 09:04:111133Durchsuche

$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>

}
?>

Lösen Sie, warum das foreach-Schleifenarray den Zeiger nur einmal an die zweite Position bewegt.

Antwortinhalt:

$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>

}
?>

Lösen Sie, warum das foreach-Schleifenarray den Zeiger nur einmal an die zweite Position bewegt.

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

Bei jeder Schleife wird current ausgeführt, sodass jede Schleife auftritt

, sodass jedes Mal, wenn current einen neuen zval ausführt.copy-on-write

Suche nach dieser Antwort

Stellungnahme:
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