> 백엔드 개발 > PHP 튜토리얼 > PHP foreach가 작동을 위해 배열을 복사해야 하는 이유는 무엇입니까?

PHP foreach가 작동을 위해 배열을 복사해야 하는 이유는 무엇입니까?

WBOY
풀어 주다: 2016-08-18 09:16:29
원래의
1236명이 탐색했습니다.

목적이 무엇인지 찾아보세요

답글 내용:

목적이 무엇인지 찾아보세요

무슨 말이야! 내 무지를 용서하십시오. 그런데 무슨 뜻입니까?

PHP foreach는 작동하기 위해 배열을 복사할 필요가 없습니다. 배열을 복사해야 한다는 것을 어디서 보셨나요?

PHP foreach는 배열의 복사본을 순회하는 동안 순회하는 동안 수정(항목 추가)으로 인한 무한 루프를 피하기 위한 것이라고 생각합니다.
어디까지나 추측입니다. . .

질문자가 foreach의 내부 구현을 알고 싶어서 실제 어레이를 작동하는 대신 작동을 위해 临时变量을 복사했습니다

저는 이 질문에 대해 늘 헷갈려 했습니다. 다음 답변은 참고용입니다. ㅎㅎ

참고자료 PHP 커널에 대한 심층적인 이해

<code> [鸟哥的php foreach](http://www.laruence.com/2008/11/20/630.html)
 </code>
로그인 후 복사

foreach이 루프에서 작동하기 위해 실제로 临时变量을 복사하고 있음을 증명하는 예를 살펴보겠습니다

<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>
로그인 후 복사

결과는 다음과 같습니다

<code class="php">2
5
0=>1
1=>2
2=>3
3=>4
4=>5
</code>
로그인 후 복사

위와 같이 foreach 루프가 시작되기 전에 next 또는 end을 호출하면 배열 포인터 위치가 변경되지만 foreach 내부에서 호출하면 루프 프로세스가 변경되지 않습니다.

순회된 코드에서 end, next 등을 통해 배열의 포인터를 연산하면 배열의 포인터가 변경되지 않습니다. 이는 PHP 커널이 FETCH 연산을 수행할 때 내부 포인터가 바뀌기 때문입니다. 현재 연산된 배열의 내용은 중간 변수에 저장되며, 요소가 탐색될 때마다 이전에 저장된 포인터 위치가 먼저 얻어지고, 다음 요소를 얻은 후 포인터 위치가 중간에 저장됩니다. FETCH OPCODE 실행 중 변수

.

여기서 foreach 루프에서 때때로 작동하는 원본 배열이 원본 배열의 복사본임을 알 수 있습니다.

이제 질문에 대답해 보겠습니다. 원래 배열에서 작동하는 대신 작동하기 위해 배열을 복사해야 하는 이유는 무엇입니까? 제 생각에는 foreach가 원래 배열에서 작동하는 경우 원래 배열의 값을 변경하는 것입니다. foreach 아니면 새로운 요소를 추가하면 어떻게 될까요? 이렇게 생각해보면 이해가 되실 텐데요,

<code class="php">foreach ($variable as $key => $value) {
    $variable[''] => mt_rand(1, 111);
}</code>
로그인 후 복사
관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿