Задать вопрос
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);

Тогда все будет как нужно. Нормально ли так? Или можно обойтись без лишнего массива?
  • Вопрос задан
  • 180 просмотров
Подписаться 1 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 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) {
вам необходимо передавать по ссылке, тогда можно менять исходный массив
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽