Palych_tw
@Palych_tw
Типа веб-разработчик

Почему foreach так работает?

Всем привет. Хочу понять, что я делаю не так. Скорее всего я чего-то не понимаю и с такой проблемой столкнулся впервые. Есть код:
foreach ($children as $child) {
                    $child['href'] = $this->url->link('product/category', 'path=' . $this->request->get['path'] . '_' . $child['category_id'] . $url);
                    var_dump($child); //здесь массив из 17 элментов, в т.ч. 'href'
                }
                var_dump($children); //здесь массив массивов, в которых по 16 эл. и 'href' нет.

Получается foreach не изменяет массив $children? Скорее всего вопрос глупый)
Я понимаю, что можно добавить еще один массив и сделать вот так:

$children = $this->model_catalog_category->getCategories($result['category_id']);
                $children_cats = array();
                foreach ($children as $child) {
                    $child['href'] = $this->url->link('product/category', 'path=' . $this->request->get['path'] . '_' . $child['category_id'] . $url);
                    $children_cats[] = $child;
                    var_dump($child);
                }
                var_dump($children_cats);

Тогда все будет как нужно. Нормально ли так? Или можно обойтись без лишнего массива?
  • Вопрос задан
  • 175 просмотров
Решения вопроса 4
@masterfreelance
программист со стажем
foreach ($children as $key => $child) {
    $children[$key]['href'] = $this->url->link('product/category', 'path='.
    $this->request->get['path'].'_'.$child['category_id'].$url);
}


или так

foreach ($children as &$child) {
    $child['href'] = $this->url->link('product/category', 'path='.
    $this->request->get['path'].'_'.$child['category_id'].$url);
}


Описание оператора foreach
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Потому что итератор по умолчанию создаёт копию объекта. Используйте ссылку:
foreach ($children as &$child) {
...
}
Ответ написан
Комментировать
Rou1997
@Rou1997
Нормально ли так?

Вам честно ответить? Нет. Нормально, это уметь делать так.
Только давайте без обид, вы спросили, я ответил, понятия о норме у всех разные, может вам нравится не уметь быстро решать проблемы, зато и усилий вкладываете по минимуму, дело ваше.
Ответ написан
foreach ($children as &$child) {
вам необходимо передавать по ссылке, тогда можно менять исходный массив
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы