Php 循环中的Laravel集合更新元素

Php 循环中的Laravel集合更新元素,php,laravel,laravel-collection,Php,Laravel,Laravel Collection,我声明了一个collect()数据类型的变量。我希望遍历它,并更新每行上的特定列 示例代码: $a=collect([ [1'=>1,[2'=>2], ['1'=>3,'2'=>4], ['1'=>5,'2'=>6] ]); foreach($a为$b){ $b['one']=0; } dd($a); 我不明白,为什么结果是这样: 收藏{510▼ #项目:阵列:3[▼ 0=>数组:2[▼ “一”=>1 “两个”=>2 ] 1=>数组:2[▼ “一”=>3 “两个”=>4 ] 2=>数组:2[

我声明了一个collect()数据类型的变量。我希望遍历它,并更新每行上的特定列

示例代码:

$a=collect([
[1'=>1,[2'=>2],
['1'=>3,'2'=>4],
['1'=>5,'2'=>6]
]);
foreach($a为$b){
$b['one']=0;
}
dd($a);
我不明白,为什么结果是这样:


收藏{510▼
#项目:阵列:3[▼
0=>数组:2[▼
“一”=>1
“两个”=>2
]
1=>数组:2[▼
“一”=>3
“两个”=>4
]
2=>数组:2[▼
“一”=>5
“两个”=>6
]
]
}

我希望每行的结果为“one”=>0。

您不是在修改原始数组,没有地方将修改后的项存储回数组。为此,最好对集合本身使用
map
功能

$a = collect([['one' => 1, 'two' => 2], ['one' => 3, 'two' => 4], ['one' => 5, 'two' => 6]]);

$a = $a->map(function($item) { 
    $item['one'] = 0; 
    return $item; 
});
每种方式的适用范围:

foreach ($a as $key => $b) {
   $b['one'] = 0;
   $a[$key] = $b; // override the original item.
}

数组也是一样:$a=[['one'=>1,'two'=>2],'one'=>3,'two'=>4],'one'=>5,'two'=>6];谢谢你的解释。这对我来说有点奇怪,这是一个特定于Laravel的(PHP)吗?我从未在其他语言中观察到类似的情况。不,不是。如果使用for each,则在每次迭代中都会获得一个项,但为了修改原始数组,需要将修改后的项放回原始数组。看看我的编辑,再次谢谢你。现在我完全理解了。从技术上讲,这称为按值传递,而不是按引用传递,这意味着你不能访问原始引用,只能访问它的副本。在PHP中,您可以在变量前面使用&例如&$a将修改原始数组(引用)。很高兴这有帮助。快乐编码:)