PHP7.2循环内操作数组变量返回结果异常问题咨询
问题原因与解决方案
这问题我之前也踩过坑!核心原因是闭包默认按值捕获变量——你写的use ($data)其实是把外部的$data复制了一份到闭包内部,闭包里修改的只是这个副本,外面的原始$data完全没被改动,所以最后输出自然还是初始的表头数组。
解决方法一:使用引用传递变量
把use ($data)改成use (&$data),这样闭包就会直接操作外部的原始数组,而不是副本。另外,追加元素其实不用array_merge,直接$data[] = $rowData更简洁高效:
$data = ['code','name']; $submission->contributions->each(function (Contribution $contribution) use (&$data) { $rowData = [ $contribution->employment->employer->code, $contribution->employment->employee->last_name, ]; $data[] = $rowData; // 直接向原始数组追加行数据 }); print_r($data);
解决方法二:利用Laravel集合的map方法(更优雅)
既然用了Laravel的集合,不如用更符合集合风格的写法,避免引用带来的潜在副作用:先通过map把每个Contribution转换成对应的行数据,再转成数组后和表头合并:
// 先转换所有贡献数据为行数组 $rows = $submission->contributions->map(function (Contribution $contribution) { return [ $contribution->employment->employer->code, $contribution->employment->employee->last_name, ]; })->toArray(); // 合并表头与行数据 $data = array_merge(['code','name'], $rows); print_r($data);
这种方式逻辑更清晰,也符合Laravel的最佳实践,推荐优先使用。
内容的提问来源于stack exchange,提问作者Cruze
相关产品推荐
相关产品推荐

