2012-10-23 23 views
11

我試圖對數組中的數據執行清理工作,專門將紀元時間轉換爲YYYY-MM-DD。爲什麼我不能用foreach循環更新數組中的數據?

我最初試圖此功能:

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']); 
} 

爲什麼第一環故障和第二工作?他們不一樣嗎?

回答

29

摧毀它,$row正在使用「按值」,而不是「被引用」。

嘗試更新的參考加上&$row

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

或者,您可以使用鍵/值的方法:因爲在foreach語句

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

感謝您的詳細解釋和例子! – Choy

+1

@Choy您可能還想看到第一個警告[here](http://php.net/manual/en/control-structures.foreach.php)。 –

7

最初的示例只傳遞按行而不是按引用。

從文檔

爲了能夠直接修改環路 上一頁$值內的數組元素與&。在這種情況下的值將通過 參考

因此被分配或者通過引用傳遞

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']); 
} 

重要性也就是此警告在docs

參考$ value和最後一個數組元素甚至在foreach循環之後仍然保留。建議當您使用您當前所在的方式,foreach ($data as $row) {一個foreach環由未設置()

相關問題