我遇到了一個奇怪的問題,可以用這個片段重現它:
<?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 下測驗。
什么可能導致這種差異?我缺少關于陣列指標的東西嗎?
uj5u.com熱心網友回復:
在您的第一個示例中,$item變數仍然包含對回圈完成時最后一個值的參考。$arr
foreach ($arr as &$item) {
$item[] = $item[0];
}
如果您使用print_r(get_defined_vars());,您可以看到陣列中有一個帶有名稱的鍵item
此處描述了 foreach 末尾的雙精度值的行為,建議使用銷毀指定的變數unset($item)
您也可以使用不同的變數名。
使用array_map,回呼獲取一個按名稱傳遞的函式引數,該引數系結到函式范圍。
如果您print_r(get_defined_vars());在使用 array_map 之后運行,您可以看到沒有名為的鍵item
uj5u.com熱心網友回復:
$arr = [];
for($i = 0; $i <= 3; $i ) {
$arr[] = [
$i
];
}
/** Output
* $arr = [[0],[1],[2],[3]]
*/
在這個 foreach 回圈中,您只需選擇 item 的現有值并將其設定為參考 item 的新索引
foreach ($arr as &$item) {
$item[] = $item[0];
}
$item 的型別是陣列,$item[0] 參考它的 0 索引 $item[] 表示當前參考的 item 內的新陣列索引。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/411449.html
標籤:
