12

我正在尝试对数组中的数据运行清理作业,特别是将纪元时间转换为 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']);
}

为什么第一个循环失败而第二个循环工作?他们不一样吗?

4

3 回答 3

33

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

&尝试通过添加来更新到参考$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']);
于 2012-10-23T02:20:27.423 回答
7

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

从文档

为了能够直接修改循环内的数组元素,在 $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']);
}

同样重要的是文档中的这个警告

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

于 2012-10-23T02:20:17.743 回答
1

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

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

于 2012-10-23T02:21:43.377 回答