2012-04-10 5 views
3

그래서이 문제를 파악하기 위해 가능한 한 코드를 최소화하면서 2 시간을 보냈지만 문제를 파악할 수는 없었습니다.왜 PHP는 배열 포인터를 계속 재설정합니까?

$arr['key']['name'] = array("one", "two", "three"); 

$counter = 0; 
do 
{ 
    $cur = current($arr); 

    $k = key($arr['key']['name']); 
    next($arr['key']['name']); 
}while($k !== null); 

이 끝없는 루프는 다음과 같습니다

그래서 나는이 코드가 있습니다. 어떤 이유로 든 $ arr [ 'key'] [ 'name'] 값을 모두 거친 후에 NULL을 반환하는 대신 key()가 다시 0으로 돌아갑니다. $ cur = current ($ arr); 그러나 그 문제를 해결합니다. According to php manual, current()은 배열 포인터에 전혀 영향을주지 않습니다. 이제 배열을 복사하면 포인터가 재설정되지만 계속 복사가 진행되지 않으며 $ k가 0에서 2로 이동하지 않고 0으로 돌아가는 대신 0으로 다시 설정 한 다음 다시 0으로 다시 설정한다는 것을 알고 있습니다.

+0

당신이'next ($ arr [ 'key'] [ 'name'])를하고 있다면'$ cur = current ($ arr [ 'key'] [ 'name']); '. – nickb

+0

왜냐하면 $ arr [ 'key'] 인 $ arr의 현재 요소 대신 $ arr [ 'key'] [ 'name']의 현재 요소를 얻을 것이기 때문입니다. – John

+0

이것은 문서화되지 않은/버그 . 나는 "$ cur = current ($ arr);"를 다시 썼다. "현재 ($ arr);" 루프가 끝났어. 또는 "$ arr [ 'key'] [ 'name']"을 "$ arr [ 'name']"로 바꿨고 루프가 모두 끝났습니다. –

답변

4

current()하지 이동 당신이 그것을 사용하는 배열에 대한 배열 포인터를 않습니다,하지만 당신은 다른 배열에 그것을 사용하고 있습니다. 중첩 된 포인터 배열을 다시 설정합니다.

+1

어떻게 시작합니까? 그것은 의미가 없으며 current() 매뉴얼의 어느 곳에서도 언급되지 않았다. – John

+1

아마 아무도 이런 방식으로 사용되기를 기대하지 않았기 때문일 것입니다. –

+0

네,하지만 실제로 중첩 된 배열에 대한 포인터를 다시 설정하면 current()가 실행될 때마다 모든 반복에 대해 그렇게하지 않지만 $ arr [ 'key'] [ 'name'] 배열 전체가 수행 된 후에 만 ​​수행됩니다 가로 지르다? – John

2

왜 그렇지 않습니까? 이렇게 해?

코드 :

foreach ($arr['key']['name'] as $k) 
{ 
    // do something with $k 

} 
+0

한 번에 모든 요소에 액세스 할 필요가 없으므로 문제를 보여주기 위해 작은 예제를 만들었습니다. 실제 코드에서는 루프가 아닙니다. – John