문제
다음 코드가 예상한 대로 작동하지 않는 이유는 무엇입니까?
<?php
$data = array(
array('Area1', null, null),
array(null, 'Section1', null),
array(null, null, 'Location1'),
array('Area2', null, null),
array(null, 'Section2', null),
array(null, null, 'Location2')
);
$root = array();
foreach ($data as $row) {
if ($row[0]) {
$area = array();
$root[$row[0]] =& $area;
} elseif ($row[1]) {
$section = array();
$area[$row[1]] =& $section;
} elseif ($row[2]) {
$section[] = $row[2];
}
}
print_r($root);
예상 결과:
Array(
[Area1] => Array(
[Section1] => Array(
[0] => Location1
)
)
[Area2] => Array(
[Section2] => Array(
[0] => Location2
)
)
)
실제 결과:
Array(
[Area1] => Array(
[Section2] => Array(
[0] => Location2
)
)
[Area2] => Array(
[Section2] => Array(
[0] => Location2
)
)
)
해결책
다음과 같이 두 줄의 코드를 수정하는 경우:
$area = array();
$section = array();
이에:
unset($area);
$area = array();
unset($section);
$section = array();
예상대로 작동합니다.
첫 번째 버전에서는 $area
그리고 $section
내부 값에 대한 "포인터" 역할을 합니다. $root
정렬.값을 먼저 재설정하면 해당 변수를 사용하여 이전 배열을 덮어쓰는 대신 새로운 배열을 만들 수 있습니다.
다른 팁
이것은 또한 작동합니다:
$root[$row[0]] = array();
$area =& $root[$row[0]];
제휴하지 않습니다 StackOverflow