2012-10-08 4 views
1

그래서 foreach는 내부 배열에 새 인덱스 추가 :내가이 있고,

$abc = array('a','b','c'); 
foreach ($abc as $k => &$a) { 
    echo $a; 
    if ($k == 1) 
     $abc[] = 'd'; 
} 

일의 예상대로, foreach 문을 반복 4 번 나에게주는 : 지금

abcd 

을하지만 때 있습니다 :

$myvar = $this->someModel->return_an_array_as_result(); // returns array([0] => array('a' => 'b')) 

foreach ($myvar as $myvar_key => &$mv){ 
    $myvar[] = array('e' => 'f'); 
    var_dump($myvar); 
    if ($myvar_key == 5) die; 
} 

foreach는 한 번만 실행됩니다.

내부 포인터를 재설정 할 때 foreach가 작동하는 방법에 대한 의견이 있으십니까?

+0

예는 한 번 실행됩니다 ... 당신에게 '$ myvar'는'array ([0] => array ('a'=> 'b'))' – Baba

+0

을 반환하지만 두 번째 코드를 자세히 살펴 보겠습니다 :'$ myvar [] ' – dmmd

+0

업데이트 된 답변보기 ...'ArrayObject' Insted를 사용해야합니다 – Baba

답변

1

, 당신은 당신이 배열을 계속 반복하는 동안 배열에 추가 ArrayObject을 허용 것이다 사용할 수 있습니다

$myvar = new ArrayObject(array('a' => 'b')); 
$x = 0; 
foreach ($myvar as $myvar_key => $mv) { 
    $myvar->append(array('e' => 'f')); 
    if (($x >= 4)) 
     break; 
    $x ++; 
} 
var_dump($myvar); 

출력

object(ArrayObject)[1] 
    public 'a' => string 'b' (length=1) 
    array 
     'e' => string 'f' (length=1) 
    array 
     'e' => string 'f' (length=1) 
    array 
     'e' => string 'f' (length=1) 
    array 
     'e' => string 'f' (length=1) 
    array 
     'e' => string 'f' (length=1) 
+0

완벽하지 않습니다. 작업 할 배열 대신 객체가 있기 때문입니다. 그러나 여전히 좋은 해결책입니다. 감사! :) – dmmd

+0

@jlcd'(array) $ myvar'는 그것을 배열로 변환합니다 .. 간단합니다. – Baba

+2

실제로'ArrayObject'는'next' 호출 사이의 변화를 인식하는 동적 Enumerable 인터페이스를 구현합니다. +1 다른 접근 방식. –

1

foreach은 실제로 배열의 복사본에서 작동하기 때문입니다. 어레이를 반복하면서 배열을 수정하려면 기존의 for 루프를 사용하십시오.

자세한 내용은 foreach에 대한 PHP 문서를 참조하십시오. 또한 반복하는 동안 요소를 수정하려는 경우 &$reference (자세한 내용은 foreach 문서에도 나와 있습니다). 난 당신의 지점을 참조

+0

하지만 어떻게 첫 번째 구현을 했나요? rk? – dmmd

+0

종료 조건에 의존하지 않고 있습니다 (조건이 이미 두 번째 반복에서 충족되고 부록이 추가되었으며 루프가 종료되었습니다). 두 번째 예제는 'foreach'가 스냅 샷을 찍었을 때 3 개의 엘리먼트 만 가질 때와 같이 5 개의 엘리먼트를 가지지 않는다. 복사본이 아니고 참조가 아니기 때문에 'foreach'는 5 개의 요소가 있음을 알기 전에 오래 전에 종료됩니다. –

+0

그러나'$ myvar []'는 $ myvar 배열에 무한한 새로운 인덱스를 추가해야하므로, 어떤 시점에서 5 개의 원소를 가져야합니다. 일어나는 일은 foreach가 소위 "스냅 샷"을 통해 한 번 반복하고 새로운 위치를 무시하는 것입니다. 나는 첫 번째와 두 번째 예의 차이점을 발견 할 수 없다. – dmmd