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

时间:2012-10-23 02:17:36

标签: php for-loop foreach

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

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

3 个答案:

答案 0 :(得分:29)

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

通过将&添加到$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']);

答案 1 :(得分:7)

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

来自文档

  

为了能够直接修改循环内的数组元素   使用&amp;前面的$ 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 :(得分:1)

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

查看文档:{​​{3}}