为啥我不能使用 foreach 循环更新数组中的数据?

Posted

技术标签:

【中文标题】为啥我不能使用 foreach 循环更新数组中的数据?【英文标题】:Why can't I update data in an array with foreach loop?为什么我不能使用 foreach 循环更新数组中的数据? 【发布时间】:2012-10-12 22:12:54 【问题描述】:

我正在尝试对数组中的数据运行清理作业,特别是将纪元时间转换为 YYYY-MM-DD。

我最初尝试过这个功能:

foreach ($data as $row) 
    $row['eventdate'] = date('Y-m-d', $row['eventdate']);


echo '<pre>';
print_r($data);
echo '</pre>';

但是当我输出它时,foreach 循环并没有更新数据。

以下 for 循环确实有效:

for ($i=0; $i<count($data); $i++) 
    $data[$i]['eventdate'] = date('Y-m-d', $data[$i]['eventdate']);

为什么第一个循环失败而第二个循环成功了?它们不一样吗?

【问题讨论】:

【参考方案1】:

初始示例仅按值传递行,而不是按引用传递。

来自文档

为了能够在循环内直接修改数组元素 在 $value 之前加上 &。在这种情况下,该值将由 参考

因此要么通过引用传递

foreach ($data as &$row) 
   $row['eventdate'] = date('Y-m-d', $row['eventdate']);

或使用更明确的语法

foreach ($data as $key => $value) 
    $data[$key]['eventdate'] = date('Y-m-d', $value['eventdate']);

文档中的这个警告也很重要

$value 的引用和最后一个数组元素即使在 foreach 循环。建议通过 unset() 销毁

【讨论】:

【参考方案2】:

当您以目前的方式使用 foreach 循环时,foreach ($data as $row) $row 被“按值”使用,而不是“按引用”。

尝试通过将&amp; 添加到$row 来更新到引用:

foreach ($data as &$row) 
    $row['eventdate'] = date('Y-m-d', $row['eventdate']);

或者,您可以使用键/值方法:

foreach ($data as $index => $row) 
    $data[$index]['eventdate'] = date('Y-m-d', $row['eventdate']);

【讨论】:

感谢您的详细解释和示例! @Choy 您可能还希望看到第一个警告here。【参考方案3】:

因为在foreach语句中,需要通过引用传递第二个参数。

查看文档:http://www.php.net/manual/en/control-structures.foreach.php

【讨论】:

以上是关于为啥我不能使用 foreach 循环更新数组中的数据?的主要内容,如果未能解决你的问题,请参考以下文章

Java中foreach为啥不能给数组赋值

为啥在foreach循环中不能修改值类型实例

foreach语句遍历数组

为啥这个 foreach 循环缺少类中的属性?

为啥我的 forEach 循环没有编辑我的数组? [复制]

为啥我需要在 foreach 循环后取消设置 $value