>백엔드 개발 >PHP 튜토리얼 >PHP에서 foreach() 사용 및 while과의 성능 비교

PHP에서 foreach() 사용 및 while과의 성능 비교

伊谢尔伦
伊谢尔伦원래의
2017-06-23 11:42:401212검색

PHP 4에서는 Perl 및 기타 언어와 마찬가지로 foreach 구문이 도입되었습니다. 이는 배열을 통해 반복하는 편리한 방법입니다. foreach는 배열에서만 사용할 수 있으며 다른 데이터 유형이나 초기화되지 않은 변수에서 사용하려고 하면 오류가 발생합니다. 두 가지 구문이 있는데, 두 번째 구문은 덜 중요하지만 첫 번째 구문의 유용한 확장입니다.

foreach (array_expression as $value)
    statement
foreach (array_expression as $key => $value)
    statement

첫 번째 형식은 주어진 array_expression 배열을 반복합니다. 각 루프에서 현재 셀의 값은 $value에 할당되고 배열 내부의 포인터는 한 단계 앞으로 이동합니다(따라서 다음 루프에서 다음 셀을 얻습니다).
두 번째 형식은 현재 셀의 키 이름이 각 루프의 $key 변수에도 할당된다는 점을 제외하면 동일한 작업을 수행합니다.
PHP 5부터는 객체 반복도 가능합니다.
참고:
foreach가 실행을 시작하면 배열 내부의 포인터가 자동으로 첫 번째 유닛을 가리킵니다. 이는 foreach 루프 전에 Reset()을 호출할 필요가 없음을 의미합니다.
참고:
배열이 참조되지 않는 한 foreach는 배열 자체가 아닌 지정된 배열의 복사본에서 작동합니다. foreach에는 배열 포인터에 몇 가지 부작용이 있습니다. 재설정되지 않는 한 foreach 루프 도중이나 이후에 배열 포인터 값을 사용하지 마세요.
PHP 5부터는 $value 앞에 &를 추가하여 배열 요소를 쉽게 수정할 수 있습니다. 이 방법은 값을 복사하는 대신 참조로 할당합니다.

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
?>

이 메서드는 순회되는 배열을 참조할 수 있는 경우에만 사용할 수 있습니다(예: 변수).

<?php
foreach (array(1, 2, 3, 4) as &$value) {
    $value = $value * 2;
}
?>

foreach는 배열 복사본에서 작동하는 반면(배열 복사를 통해) while은 배열의 내부 인덱스를 이동하여 작동합니다. 일반적으로 foreach가 먼저 배열을 복사하기 때문에 while이 foreach보다 빠릅니다. 실행이 시작되면 while 내부 표시기를 직접 이동하지만 결과는 정반대입니다.
루프에서 배열 "읽기" 작업이 수행되므로 foreach가 while보다 빠릅니다.

foreach ($array as $value) { 
echo $value; 
} 
while (list($key) = each($array)) { 
echo $array[$key]; 
}

루프에서 배열 "쓰기" 작업이 수행된 다음 while이 foreach보다 빠릅니다.

foreach ($array as $key => $value) { 
echo $array[$key] = $value . &#39;...&#39;; 
} 
while (list($key) = each($array)) { 
$array[$key] = $array[$key] . &#39;...&#39;; 
}

요약: 일반적으로 foreach는 값으로 복사하는 것이 while보다 확실히 느리다고 생각합니다. 그러나 실제로 루프에서 배열만 읽는 경우 foreach는 매우 빠릅니다. 이는 PHP에서 사용하는 복사 메커니즘이 "참조 계산"이기 때문입니다. copy-on-write"” 즉, PHP에서 변수를 복사하더라도 초기 형식은 실제로 여전히 참조 형식입니다. 변수의 내용이 변경된 경우에만 실제 복사본이 발생합니다. 그 이유는 메모리 소모를 줄이기 위해 복사의 효율성도 향상시키기 때문입니다. 이러한 관점에서 foreach의 효율적인 읽기 작업을 이해하는 것은 어렵지 않습니다. 또한 foreach는 배열 쓰기 작업을 처리하는 데 적합하지 않기 때문에 대부분의 경우 foreach($array as $key => $value) 형식으로 배열 쓰기 작업을 수행하는 코드는 다음으로 대체해야 한다는 결론을 내릴 수 있습니다. while (목록($key) =
각($array)). 이러한 기술로 인해 발생하는 속도 차이는 소규모 프로젝트에서는 뚜렷하지 않을 수 있지만 프레임워크와 같은 대규모 프로젝트에서는 단일 요청에 수백, 수천 또는 수천만 개의 배열 루프 작업이 포함되는 경우가 많으며 그 차이는 상당히 확대됩니다.

위 내용은 PHP에서 foreach() 사용 및 while과의 성능 비교의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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