【发布时间】:2022-01-13 04:19:59
【问题描述】:
我遇到了一个奇怪的问题,可以用这个 sn-p 重现它:
<?php
$arr = [];
for($i = 0; $i <= 3; $i++) {
$arr[] = [
$i
];
}
foreach ($arr as &$item) {
$item[] = $item[0];
}
foreach ($arr as $item) {
print_r($item);
}
它正在输出(注意最后一个元素已被其前一个元素的副本替换):
Array
(
[0] => 0
[1] => 0
)
Array
(
[0] => 1
[1] => 1
)
Array
(
[0] => 2
[1] => 2
)
Array
(
[0] => 2
[1] => 2
)
但是,这是预期的结果:
Array
(
[0] => 0
[1] => 0
)
Array
(
[0] => 1
[1] => 1
)
Array
(
[0] => 2
[1] => 2
)
Array
(
[0] => 3
[1] => 3
)
如果我使用array_map 而不是第一个foreach,它可以工作:
<?php
$arr = [];
for($i = 0; $i <= 3; $i++) {
$arr[] = [
$i
];
}
$arr = array_map(function ($item) {
$item[] = $item[0];
return $item;
}, $arr);
foreach ($arr as $item) {
print_r($item);
}
在 PHP 8.0.0 下测试。
什么可能导致这种差异?我缺少关于数组指针的东西吗?
【问题讨论】: