Я сократил свой реальный код, чтобы дать более точный пример. Вот что у меня есть:
$result = [];
$entry = null;
$prev = null;
$arr = [1, 2, 3];
foreach ($arr as $val) {
$entry = [
'val' => $val,
'children' => []
];
if ($prev) {
array_push($prev['children'], $entry);
} else {
array_push($result, $entry);
}
$prev = $entry;
}
var_dump($result);
Когда этот код запускается, он выводит это:
array(1) {
[0]=>
array(2) {
["val"]=>
int(1)
["children"]=>
array(0) {
}
}
}
Мой желаемый результат:
array(1) {
[0]=>
array(2) {
["val"]=>
int(1)
["children"]=>
array(1) {
[0]=>
array(2) {
["val"]=>
int(2)
["children"]=>
array(1) {
[0]=>
array(2) {
["val"]=>
int(3)
["children"]=>
array(0) {
}
}
}
}
}
}
}
Я почти наверняка это происходит, потому что в этой строке:
$prev = $entry;
... значение $prev
установлено на copy of $entry
. Итак, на следующей итерации, когда я превращаю sh в $prev['children']
, я изменяю скопированный массив, а не исходный, который был помещен в $result
на первой итерации.
Я попытался использовать ссылку:
$prev = &$entry;
... но результат тот же. Теперь $prev
устанавливается как содержимое $entry
, но когда $entry
установлен как новый массив на следующей итерации, $prev
указывает на этот новый массив, а не на предыдущий, что бесполезно.
Я хочу, чтобы $prev
указывал на содержимое из $entry
и не изменялся при дальнейших мутациях переменной $entry
. Как мне это сделать?