Почему я не могу обновлять данные в массиве с помощью цикла foreach?

Я пытаюсь запустить очистку работы с данными в массиве, в частности, конвертируя время в ГГГГ-ММ-ДД.

Я попробовал эту функцию изначально:

foreach ($data as $row) { $row['eventdate'] = date('Ym-d', $row['eventdate']); } echo '<pre>'; print_r($data); echo '</pre>'; 

Однако цикл foreach не обновлял данные при его выходе.

Следующий цикл for работал:

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

Почему первый цикл вышел из строя, а вторая работа? Разве они не то же самое?

Когда вы используете цикл foreach в том виде, в котором вы сейчас находитесь, foreach ($data as $row) { , $row используется «по значению», а не «по ссылке».

Попробуйте обновить ссылку, добавив $row & в $row :

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

Или вы можете использовать метод key / value:

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

Исходный пример только передает строку по значению, а не по ссылке.

Из документов

Чтобы иметь возможность напрямую изменять элементы массива в цикле, перед значением $ value нужно указать &. В этом случае значение будет присвоено ссылкой

Следовательно, либо переходите по ссылке

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

или использовать более явный синтаксис

 foreach ($data as $key => $value) { $data[$key]['eventdate'] = date('Ym-d', $value['eventdate']); } 

Также важно это предупреждение в документах

Ссылка на значение $ и последний элемент массива остаются даже после цикла foreach. Рекомендуется уничтожить его unset ()

Потому что в инструкции foreach вам нужно передать второй аргумент по ссылке.

Проверьте документацию: http://www.php.net/manual/en/control-structures.foreach.php