Laravel Collection 循环更新元素

The*_*Vic 4 php laravel laravel-collection

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

\n

示例代码:

\n
    $a = collect([\n        [\'one\' => 1, \'two\' => 2],\n        [\'one\' => 3, \'two\' => 4],\n        [\'one\' => 5, \'two\' => 6]\n    ]);\n\n    foreach ($a as $b) {\n        $b[\'one\'] = 0;\n    }\n\n    dd($a);\n
Run Code Online (Sandbox Code Playgroud)\n

我不明白,为什么结果是这样的:

\n
\nCollection {#510 \xe2\x96\xbc\n  #items: array:3 [\xe2\x96\xbc\n    0 => array:2 [\xe2\x96\xbc\n      "one" => 1\n      "two" => 2\n    ]\n    1 => array:2 [\xe2\x96\xbc\n      "one" => 3\n      "two" => 4\n    ]\n    2 => array:2 [\xe2\x96\xbc\n      "one" => 5\n      "two" => 6\n    ]\n  ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我期望每行的结果是“one”=> 0。

\n

nak*_*kov 6

您没有修改原始数组,没有地方可以将修改后的项目存储回数组。为此,最好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; 
});
Run Code Online (Sandbox Code Playgroud)

对于每种方式:

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

  • 不它不是。如果使用 for every,则每次迭代都会获得一个项目,但为了修改原始数组,您需要将修改后的项目放回原始数组。看看我的编辑。 (2认同)
  • 从技术上讲,这称为按值传递而不是按引用传递,这意味着您无法访问原始引用,而是访问它的副本。在 PHP 中,您可以在变量前面使用 &,例如 &$a 将修改原始数组(引用)。很高兴有帮助。快乐编码:) (2认同)