Ошибка при попытке обновить массив - PullRequest
0 голосов
/ 29 июня 2018

У меня есть два вопроса с проектом Symfony.

Мой первый: Я пытаюсь изменить некоторые данные в массиве. У меня есть этот код

var_dump($results); // FIRST ONE
foreach ($results as $result) {
    foreach ($result as $res) {
        foreach ($dates as $date) {
            if(!array_key_exists($date,$res)) {
                $res = array_merge($res,[$date => '0']);
            }
        }
        var_dump($res); // THIS ONE IS MODIFIED
    }
}
var_dump($results); // LAST ONE... SAME AS THE FIRST ONE

Я не понимаю, почему мой массив '$ results' не обновляется ... я что-то упустил?

И мой второй вопрос: есть ли способ упростить этот код? Мне не нравится 3 foreach.

Спасибо, ребята:)

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Если вы не передаете объект в PHP, PHP не передает значения по ссылке. $ res является копией значения, а не ссылкой на исходное значение. Если вы знаете, что делаете, вы можете пройти по ссылке. При передаче по ссылке изменение $ res приведет к изменению исходных данных. Вы передаете по ссылке, добавляя префикс & к переменной или аргументу.

Так как это вложенный foreach, вам также придется передавать $ result по ссылке, чтобы не быть копией элемента $ results.

foreach ($results as &$result) {
    foreach ($result as &$res) {
        foreach ($dates as $date) {
            if(!array_key_exists($date,$res)) {
                $res = array_merge($res,[$date => '0']);
            }
        }
    }
}
0 голосов
/ 29 июня 2018

PHP foreach копирует каждый элемент при повторении, чтобы массив $ result не обновлялся при изменении элемента $ res.

1) Вы можете использовать ключи массива для изменения основного массива

foreach($arrr as $k => $item) {arrr[$k]['key'] = 'changed'}

2) Или вы можете получить ссылку на элемент $ res и изменить ее напрямую

foreach($arrr as &$item) {$item['key'] = 'changed'}

Обратите внимание, что второй случай может вызвать различные проблемы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...