【问题标题】:Laravel collection incrementing inside map not possible with arrow functionLaravel 集合不能使用箭头函数在地图内递增
【发布时间】:2021-08-10 19:26:23
【问题描述】:

我试图在map 方法期间递增,但是我的变量似乎没有保存新值。我的代码:

$position = 0;

$statement = $medias->map(fn(string $media) => [
                'position' => ++$position
            ])->values();

我的预期结果是:

#items: array:4 [
    0 => array:4 [
      "position" => 1
    ]
    1 => array:4 [
      "position" => 2
    ]
    2 => array:4 [
      "position" => 3
    ]
    3 => array:4 [
      "position" => 4
    ]
  ]

其实是这样的

 #items: array:4 [
        0 => array:4 [
          "position" => 1
        ]
        1 => array:4 [
          "position" => 1
        ]
        2 => array:4 [
          "position" => 1
        ]
        3 => array:4 [
          "position" => 1
        ]
      ]

map 内增加是不可能的还是我在这里做错了什么?

【问题讨论】:

  • 您的错误信息是什么?我敢打赌,可以通过像这样更改以下行来解决:$statement = $medias->map(fn(string $media) use($position) => [
  • 实际上根本没有错误,一切运行正常,但它给了我错误的值:/我尝试使用你的建议,但 PHPStorm 给了我这个错误:必须在文件的最外层范围(全局范围)或内部
  • 那是因为我很笨,没有仔细阅读。否则,我会看到您使用了箭头函数,而这些函数不需要使用use()。很抱歉

标签: php laravel increment


【解决方案1】:

这里的问题是您希望$position 变量通过引用传递,但事实并非如此。

箭头函数使用按值变量绑定。这大致相当于对箭头函数中使用的每个变量 $x 执行 use($x)。按值绑定意味着不可能从外部范围修改任何值。可以使用匿名函数代替按引用绑定。 PHP Manual - Arrow Functions

您的解决方法可能是这样的:

// Either
$posObj = new \stdClass();
$posObj->position = 0;
// or
$posObj = (object)array('position' => 0);

$statement = $medias->map(fn(string $media) => [
                'position' => ++$posObj->position
            ])->values();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-28
    • 2018-06-26
    • 2015-01-25
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 2018-09-30
    相关资源
    最近更新 更多