목적이 무엇인지 찾아보세요
목적이 무엇인지 찾아보세요
무슨 말이야! 내 무지를 용서하십시오. 그런데 무슨 뜻입니까?
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>