2009-11-06 6 views
24
for 루프에서 우리는 어떻게해야하는지에 대해 들었습니다 :

PHP foreach 루프의 배열은 어떻게 읽습니까?

for ($i = 0, $count = count($array); $i < $c; ++$i) 
{ 
    // Do stuff while traversing array 
} 
대신

for ($i = 0; $i < count($array); ++$i) 
{ 
    // Do stuff while traversing array 
} 
성능상의 이유로 (예 : $count 초기화는 count()를 한 번만 호출했을 것입니다. 조건부 검사마다 count()를 호출하는 대신).

그러면 foreach 루프에서 다음과 같이 변경됩니다.

$array = do_something_that_returns_an_array(); 

foreach ($array as $key => $val) 
{ 
    // Do stuff while traversing array 
} 

대신

foreach (do_something_that_returns_an_array() as $key => $val) 
{ 
    // Do stuff while traversing array 
} 

상황에 따라 둘 중 하나를 사용할 수 있습니까? 즉, PHP는 두 경우 모두 한 번만 함수를 호출합니까? 아니면 for처럼 두 번째 경우에서 함수를 계속 호출 할 것입니까?

+8

테스트를 실행하십시오. 'do_something_that_returns_an_array()'함수가 내부적으로 어떤 것을 echo합니다. – Artelius

답변

38

foreach()implemented using iterators입니다. 따라서 배열을 한 번 반환하는 함수를 호출 한 다음 기존 결과 집합을 가리키는 반복자를 사용하여 각 항목을 계속 처리합니다.

8

foreach은 입력 배열의 복사본을 만들고 각 반복에서 그 배열을 처리합니다. 따라서 foreach (do_something_that_returns_an_array() as $key => $val)을 사용하면 do_something_that_returns_an_array() 번만 호출됩니다.

+2

그 말씨가 정확하지 않습니다. 기술적으로 PHP 배열은 copy-on-write이므로 배열이 복사되었다고 할 때 문언은 가장 모호하고 최악의 경우입니다. 반환 값은 "있는 그대로"사용됩니다. – cletus

0

foreach()는 Iterator 또는 IteratorAggregate 개체 (예 : 인터페이스를 구현하는 배열 및 개체)와 함께 작동합니다. 불변의 개체와는 작동하지 않습니다. 복귀 배열이 항상 do_something_that_returns_an_array() 한 번만 실행되는 것으로 가정 한

+0

불변 == 매우 상수 :) PHP에서 함수가 반환하는 객체를 변경할 수 없습니다. L-Value (f() = 1은 사용할 수 없습니다.) 중 하나가 실패하면 array_push (f() , 123)) –

+0

함수는 불변 개체를 반환하지 않습니다. 객체 참조의 특수성으로 인해 객체를 참조 해제 할 수 있고'getObject() -> foo = 'bar''를 매우 잘 수행 할 수 있습니다. (객체에 대한 참조가 있으면 업데이트됩니다.) ... 역 참조 배열 ('getArray() [ 'foo']'가 작동하지 않는다). 그러나 PHP에는 불변 객체와 같은 것이 없습니다. 개체를 역 참조하거나 수정할 수 있습니다 (액세스 제한은 무시할 수 없음). – ircmaxell

2

(는 PHP 자체로 만들어졌다) foreaching 전에 Iterator 객체에 복사 할 수 있도록 기능, 불변 개체를 반환 때문에 for 루프, 거기에 달리 여러 번 실행해야 할 이유가 없습니다. for 루프 진리 검사기가 모든 반복의 끝에서 실행되는 이유는 매우 복잡한 검사기를 허용하는 것입니다.

function get_array() {echo 5; return array(1,2,3,4,5);} 
foreach(get_array() as $key => $value) {} 

이 스크립트는 한 번에 5 인쇄 :

테스트, 나는 다음과 같은했다. 따라서 함수 get_array()은 한 번만 계산됩니다.

9

필자는 테스트를 통해 확실하게 대답 할 것이라고 생각합니다.

 
Case #1 
I am called. 
    Inside the loop: One => 1 
    Inside the loop: Two => 2 
    Inside the loop: Three => 3 
    Inside the loop: Four => 4 
    Inside the loop: Five => 5 

Case #2 
I am called. 
    Inside the loop: One => 1 
    Inside the loop: Two => 2 
    Inside the loop: Three => 3 
    Inside the loop: Four => 4 
    Inside the loop: Five => 5 

그들은 모두 한 번에 통화 기능을 읽어 여기

function GetArray() { 
    echo "I am called.\n"; 
    return array("One"=>1, "Two"=>2, "Three"=>3, "Four"=>4, "Five"=>5); 
} 

echo "Case #1\n"; 
$array = GetArray(); 
foreach ($array as $key => $val){ 
    // Do stuff while traversing array 
    echo " Inside the loop: $key => $val\n"; 
} 
echo "\n"; 

echo "Case #2\n"; 
foreach (GetArray() as $key => $val) { 
    // Do stuff while traversing array 
    echo " Inside the loop: $key => $val\n"; 
} 
echo "\n"; 

는 결과입니다

여기 내 코드입니다. 그래서 다르지 않습니다.

관련 문제