2012-07-04 2 views
1

중첩 배열이있어서 내부 배열을 뒤섞고 싶습니다. 내 코드 (단순화 된) 다음과 같다 :내 중첩 배열에서 PHP 셔플이 예상대로 작동하지 않습니다.

$a = array(array('banana', 'peach'), array('ding', 'dong'), array('oh snow')); 
foreach ($a as &$arr) { 
    shuffle($arr); 
} 
var_dump($a); 

위해서 var_dump 출력이 :

array(3) { [0]=> array(2) { [0]=> string(5) "peach" [1]=> string(6) "banana" } [1]=> array(2) { [0]=> string(4) "ding" [1]=> string(4) "dong" } [2]=> &array(1) { [0]=> string(7) "oh snow" } } 

는 출력에서 ​​볼 수있는 바와 같이, 처음 두 개의 서브 어레이가 작동하지만, 세 번째 서브 어레이 참조로 연결된 ...

건배를 출력에 ... 내 전체 응용 프로그램에서

는,이 마지막 배열 연결 문제가 발생, 오히려 문제를 해결 작업을보다,이 셔플 일을 해결하고 싶다!

+0

또한 하나의 항목 만 포함하는 하위 배열과는 아무런 관련이 없다고 추가 할 수 있습니다. 집합의 마지막이므로 상황이 최하위 배열에서 발생합니다. – Tominator

답변

2

이것은 PHP가 배열 요소에 대한 참조를 저장하는 방법과 관련이 있습니다. 배열 요소를 참조 할 수는 없으며 값만 참조 할 수 있습니다. 따라서 심볼 테이블의 "슬롯"에 array('oh snow') 값을 저장 한 다음 $arr$a[2]을 해당 값에 대한 참조로 설정해야합니다.

이 문제를 해결하려면 루프 후 unset($arr)을 수정하십시오. 그런 식으로 하나의 변수 만이 값을 참조하고 있으며, 그러면 다시 정규 배열 인덱스가됩니다. foreach 이후의 참조 설정을 해제하는 것은 어쨌든 좋은 연습입니다. 왜냐하면 그러한 시도가 많기 때문입니다.

+0

얼마나 영리합니까 (그리고 약간의 지식은 내가 전에도 들어 본 적이 없다)! 나는 실제로 방금 놀았지만, 셔플 기능은 전혀 문제와 관련이 없습니다. for 루프가 작동 한 후에 $ arr을 해제하면 감사합니다! – Tominator

+0

새 코드가 갑자기 오작동하기 시작하면 실시간 실행 중에 나를 구해 줬습니다. 나는이 대답을 찾지 않고서는 결코 깨닫지 못했을 것이다. 그래서 +1은 당신을 위해 :-) – markdwhite

관련 문제