【问题标题】:Laravel eloquent chunk does not workLaravel 雄辩的块不起作用
【发布时间】:2017-12-06 04:05:56
【问题描述】:

我在 应用程序中尝试了以下使用chunk

$out = [];
\App\User::chunk(5,function($users) use($out){
   foreach($users as $user){
       //$out[] = $user;
       $out[] = $user->id;
   }
});
dd($out);

但是,dd($out) 的输出仍然是空数组。这里有什么问题? $out 在全球范围内!

【问题讨论】:

  • 这不是块的问题,它是 PHP 的事情......数组在写入时复制,除非另有说明
  • @raina77ow 它按预期返回单个项目数组。即array:1 [▼ 0 => 1 ]
  • 在下面回答,3v4l.org/IQsMO

标签: laravel-5.4 php laravel laravel-5 laravel-5.4


【解决方案1】:

数组在写入时复制。当您尝试写入您尝试从父范围导入的数组时,您只是在该范围内创建一个新数组。

您需要使用对数组的引用。

function ($users) use (&$out) { ... }

【讨论】:

  • 它有效,但它打破了我对范围的理解。数组是一个变量,定义在全局或者父作用域,所以逻辑上应该用子作用域的新数据来更新!!!
  • @SaidbakR 不要将变量与类混淆,对象总是通过引用传递。 3v4l.org/VXfm5
  • "从 PHP 5 开始,对象变量不再包含对象本身作为值。它只包含一个对象标识符,允许对象访问者找到实际对象。当一个对象由参数,返回或分配给另一个变量,不同的变量不是别名:它们持有标识符的副本,它指向同一个对象。"
【解决方案2】:

请看,PHP 中的use 不仅仅使外部作用域的变量在函数中可用(类似于 JS 中的词法作用域等)。它复制该变量的值(以及here's more explanation,由于某种原因在官方文档中仍然缺失)。

use 用作在函数内部传递一些值而不实际使其成为形式参数(函数签名的一部分)的意思。

最重要的是,您应该将数组作为引用传递:

\App\User::chunk(5,function($users) use(&$out){
   foreach($users as $user){
       //$out[] = $user;
       $out[] = $user->id;
   }
});

【讨论】:

  • 解决范围概念冲突的好解释!谢谢。
猜你喜欢
  • 2023-04-07
  • 2015-06-25
  • 2019-08-13
  • 2015-02-25
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多