@jheka524
Web-developer

Почему такой код не работает?

У меня есть массив с постами.
Выглядит он следующим образом:
array(3) {
  [0]=>
  array(10) {
    ["id"]=>
    int(79)
    ["date"]=>
    string(19) "2017-11-02 15:55:19"
    ["status"]=>
    string(5) "draft"
    ["title"]=>
    string(5) "new d"
    ["body"]=>
    string(51) "<p><strong>ddd</strong></p>"
    ["author"]=>
    string(36) "167da1e5-e333-4497-b649-8b1f786bd7bd"
    ["views_count"]=>
    int(0)
    ["count_comments_new"]=>
    string(1) "0"
    ["count_comments_total"]=>
    int(0)
  }
  [1]=>
  array(10) {
    ["id"]=>
    int(80)
    ["date"]=>
    string(19) "2017-11-02 16:00:24"
    ["status"]=>
    string(5) "draft"
    ["title"]=>
    NULL
    ["body"]=>
    string(22) "<p>asd</p>"
    ["author"]=>
    string(36) "167da1e5-e333-4497-b649-8b1f786bd7bd"
    ["views_count"]=>
    int(0)
    ["count_comments_new"]=>
    string(1) "0"
    ["count_comments_total"]=>
    int(0)
  }
  [2]=>
  array(10) {
    ["id"]=>
    int(81)
    ["date"]=>
    string(19) "2017-11-02 16:01:14"
    ["status"]=>
    string(5) "draft"
    ["title"]=>
    string(3) "qwe"
    ["body"]=>
    string(13) "<p>dddwww</p>"
    ["author"]=>
    string(36) "167da1e5-e333-4497-b649-8b1f786bd7bd"
    ["views_count"]=>
    int(0)
    ["count_comments_new"]=>
    string(1) "0"
    ["count_comments_total"]=>
    int(0)
  }
}


Появилась задача подставить в каждый пост некий урл.
Перебирая foreach'ом посты я добавлял к ним урлы.

foreach ($posts as $post) {
           $post['editUrl'] = url('site/siteId/blog/postId/edit/editPost');
           $post['settingUrl'] = url('site/siteId/blog/postId/settings');
        }


Проблема заключается в том что если сделать var_dump($posts) после foreach'а то урлов в массиве я не найду.
Что самое интересное если прогонять $posts for'ом то такой проблемы не наблюдается.
Почему так происходит? Это особенности работы foreach'a?
  • Вопрос задан
  • 207 просмотров
Решения вопроса 1
@Camaro67
Помог? - "Отметить решением"
foreach ($posts as &$post) {
           $post['editUrl'] = url('site/siteId/blog/postId/edit/editPost');
           $post['settingUrl'] = url('site/siteId/blog/postId/settings');
        }
unset($post);
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
0xD34F
@0xD34F
Дело в том, что $post - это копия, а не оригинальный массив.

Делайте так: foreach ($posts as &$post) {.
Ответ написан
Комментировать
@heahoh
Full stackoverflow developer
PHP делает копию переменной внутри цикла (и некоторых других ситуациях) $post. Чтобы этого избежать - используйте ссылку на объект &
foreach ($posts as &$post) {
Ответ написан
Ваш ответ на вопрос

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

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