Я пытаюсь запустить очистку работы с данными в массиве, в частности, конвертируя время в ГГГГ-ММ-ДД.
Я попробовал эту функцию изначально:
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