foreach 수정



1. foreach() 루프는 더 이상 배열 내부 포인터에서 작동하지 않습니다.

$array = [0, 1, 2];
foreach ($array as &$val) 
{
    var_dump(current($array));
}
PHP7은 결과적으로 int(0)을 세 번 인쇄합니다. 이는 배열의 내부 포인터가 변경되지 않았음을 의미합니다.

이전 실행의 결과는 int(1), int(2) 및 bool(false)를 인쇄합니다.

2. 값에 따라 반복할 때 foreach는 array# 🎜🎜#
foreach가 값(값 기준)으로 루프하는 경우 foreach는 배열 복사본에서 작동합니다. 이러한 방식으로 루프 중에 배열을 수정해도 루프 동작에 영향을 주지 않습니다.

$array = [0, 1, 2];
$ref =& $array; // Necessary to trigger the old behavior
foreach ($array as $val) {
    var_dump($val);
    unset($array[1]);
}
위의 코드가 루프에서 배열의 두 번째 요소를 설정 해제하더라도 PHP7은 여전히 ​​세 가지 요소를 인쇄합니다: (0 1 2)
이전 버전의 PHP는 1 Skip만 인쇄하고 print (0 2).

3. 참조에 따라 반복할 때 배열을 수정하면 루프에 영향을 미칩니다.

루프할 때 참조를 사용하는 경우 배열을 수정하면 루프 동작에 영향을 미칩니다. 그러나 PHP7 버전은 다양한 시나리오에서 위치 유지 관리를 최적화합니다. 예를 들어, 반복하는 동안 배열에 요소를 추가합니다.

$array = [0];
foreach ($array as &$val) {
    var_dump($val);
    $array[1] = 1;
}

위 코드에 추가된 요소도 루프에 참여하므로 PHP7은 "int(0) int(1)"를 인쇄하고 이전 버전에서는 "int(0)만 인쇄합니다. ".

4. 단순 객체에 대한 반복(탐색 불가능).


값 기준 루핑이든 참조 기준 루핑이든 단순한 객체에 대한 루핑은 배열에서 참조 기준 루핑과 동일하게 동작합니다. 그러나 위치 관리가 더 정확해집니다.

5. Traversable 객체의 객체 동작은 이전과 동일합니다.

편집자 주: 위의 stackoverflow 설명: Traversable 객체는 Iterator 또는 IteratorAggregate 인터페이스를 구현하는 객체입니다. 객체가 반복자 또는 IteratorAggregate 인터페이스를 구현하는 경우 반복자 객체라고 부를 수 있습니다.