>  기사  >  백엔드 개발  >  foreach 루프 배열이 포인터를 두 번째 위치로 한 번만 이동하는 이유를 해결하세요.

foreach 루프 배열이 포인터를 두 번째 위치로 한 번만 이동하는 이유를 해결하세요.

WBOY
WBOY원래의
2016-08-20 09:04:111089검색

$countries = [

<code>        [
            '0' => [
                'id' =>0
            ]
        ],
        [
            '1' => [
                'id' =>1
            ]
        ],
</p>
<p>];<br>foreach($countries를 $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>

}
?>

foreach 루프 배열이 포인터를 두 번째 위치로 한 번만 이동하는 이유를 해결하세요.

답글 내용:

$countries = [

<code>        [
            '0' => [
                'id' =>0
            ]
        ],
        [
            '1' => [
                'id' =>1
            ]
        ],
</p>
<p>];<br>foreach($countries를 $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>

}
?>

foreach 루프 배열이 포인터를 두 번째 위치로 한 번만 이동하는 이유를 해결하세요.

foreach 루프에 정의된 $countries$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을 작동할 때마다

이 답변을 찾고 있습니다

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.