首頁 > 後端開發 > php教程 > 解 為什麼foreach 迴圈數組只會講指針移動一次到第二位,

解 為什麼foreach 迴圈數組只會講指針移動一次到第二位,

WBOY
發布: 2016-08-20 09:04:11
原創
1133 人瀏覽過

$countries = [

<code>        [
            '0' => [
                'id' =>0
            ]
        ],
        [
            '1' => [
                'id' =>1
            ]
        ],</code>
登入後複製
登入後複製

];
foreach ($countries as $key => $value) {

<code>print_r(current($countries));
echo '下一个'; print_r(pos($countries)); next($countries);
echo PHP_EOL;
</code>
登入後複製
登入後複製

}
?>

解 為什麼foreach 迴圈數組只會講指針移動一次到第二位,

回覆內容:

$countries = [

<code>        [
            '0' => [
                'id' =>0
            ]
        ],
        [
            '1' => [
                'id' =>1
            ]
        ],</code>
登入後複製
登入後複製

];
foreach ($countries as $key => $value) {

<code>print_r(current($countries));
echo '下一个'; print_r(pos($countries)); next($countries);
echo PHP_EOL;
</code>
登入後複製
登入後複製

}
?>

解 為什麼foreach 迴圈數組只會講指針移動一次到第二位,

已經定義的$countries和foreach循環中的$countries指向的是同一個zval變數, 因為PHP要節省內存,不需要同樣的資料存兩份。這時候zval中的refcount為2. 但是如果在循環中改變$countries, 比如說

<code class="php">
foreach ($countries as &$country) {
    $country = 'china';    //因为这里进行了赋值操作, 这里发生了copy-on-write
}</code>
登入後複製

<code class="php">foreach ($countries as $country) {
    echo current($countries);    //因为current是要传引用的, 这里发生了copy-on-write
}</code>
登入後複製

傳了引用, 並且賦值,為觸發 copy-on-write 操作, 就是寫時複製. 會將zval複製一份, 並把原來的zval的refcount減1.

每次循環時, 都會執行current,所以每次循環都發生copy-on-write, 所以每次current 操作的是一份新的zval.

同求這個答案

相關標籤:
php
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板