【问题标题】: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']);
}

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

【问题讨论】:

    标签: php for-loop foreach


    【解决方案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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-31
        • 2017-04-17
        • 1970-01-01
        • 2015-02-06
        • 1970-01-01
        • 2018-11-10
        • 1970-01-01
        相关资源
        最近更新 更多