ogregor
@ogregor
арендатор vpn сервера debian

Почему при переборе 2х мерного массива данные сохраняются во втором уровне, но не сохраняются в 1?

Здравствуйте, не могу понять почему при переборе двумерного массива измененные данные сохраняются на втором уровне, но при вызове массива с 1 уровня их нет?

foreach ($row as $data) {
            //заполняем тему сообщения
            switch ($data['theme']) {
            case 1: $data['theme'] = 'спектакль';
            case 2: $data['theme'] = 'за кадром';
            case 3: $data['theme'] = 'мероприятие';
             }
            // времени назад
            $data['timeago'] = RUtils::dt()->distanceOfTimeInWords($data['dateReq'], $fromTime, $accuracy) ; 
            //           
            var_dump($data);                              
        }       
        var_dump($row);


Листинги:

$data =>
array (size=10)
  'id' => string '111' (length=3)
  'idUser' => string '2' (length=1)
  'dateReq' => string '2015-09-16 16:23:08' (length=19)
  'subject' => string 'Куа́ла-Лу́мпур' (length=27)
  'date' => string '09/16/2015' (length=10)
  'theme' => string 'мероприятие' (length=22)
  'image' => string '1' (length=1)
  'message' => string 'Куа́ла-Лу́мпур[1] (малайск. Wilayah Persekutuan Kuala Lumpur (Куала-Лумпур в переводе: «грязное устье»), джави:كوالا لومڤور) — столица Малайзии.
Население на 2009 год составляет 1 809 699 человек. Мэром (datuk bandar) Куала-Лумпура с 2012 года является Ахмад Фесал Талиб.
Город расположен на юго-западе полуостро'... (length=1955)
  'status' => string 'записано' (length=16)
  'timeago' => string '23 часа, 9 минут назад' (length=37)


$row =>
array (size=3)
  0 => 
    array (size=9)
      'id' => string '111' (length=3)
      'idUser' => string '2' (length=1)
      'dateReq' => string '2015-09-16 16:23:08' (length=19)
      'subject' => string 'Куа́ла-Лу́мпур' (length=27)
      'date' => string '09/16/2015' (length=10)
      'theme' => string '2' (length=1)
      'image' => string '1' (length=1)
      'message' => string 'Куа́ла-Лу́мпур[1] (малайск. Wilayah Persekutuan Kuala Lumpur (Куала-Лумпур в переводе: «грязное устье»), джави:كوالا لومڤور) — столица Малайзии.
Население на 2009 год составляет 1 809 699 человек. Мэром (datuk bandar) Куала-Лумпура с 2012 года является Ахмад Фесал Талиб.
Город расположен на юго-западе полуостро'... (length=1955)
      'status' => string 'записано' (length=16)
  1 => 
    array (size=9)
      'id' => string '112' (length=3)
      'idUser' => string '2' (length=1)
      'dateReq' => string '2015-09-16 17:41:27' (length=19)
      'subject' => string 'всякое' (length=12)
      'date' => string '09/17/2015' (length=10)
      'theme' => string '2' (length=1)
      'image' => string '1' (length=1)
      'message' => string 'Претензии Запада к таким странам, как Сирия, Россия и Иран, заключаются на самом деле в том, что они — суверенные государства. Такое мнение высказал сирийский президент Башар Асад в интервью RT, Первому каналу, «России 24», НТВ, «Россия сегодня», ТАСС, «Интерфаксу» и «Российской газе'... (length=1699)
      'status' => string 'записано' (length=16)


Как видно, на первом уровне не отображаются изменения и дополнения в подмассивах.
  • Вопрос задан
  • 211 просмотров
Решения вопроса 1
miraage
@miraage
Старый прогер
foreach ($row as &$data)
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@riente
Когда вы делаете $data['theme'] = 'спектакль', вы присваиваете строку переменной $data['theme'], но не элементу массива $row.
Но если передавать по ссылке, то при изменении значения в $data, они затронут и исходный массив.
Ответ написан
prototype_denis
@prototype_denis
Symfony
switch ($data['theme']) {
    case 1: $data['theme'] = 'спектакль';
    case 2: $data['theme'] = 'за кадром';
    case 3: $data['theme'] = 'мероприятие';
}

Если $data['theme'] равна 1 или 2 или 3, результат будет "мероприятие".

switch ($data['theme']) {
    case 1:
        $data['theme'] = 'спектакль';
        break; // <--- Не забываем
    case 2:
        $data['theme'] = 'за кадром';
        break; // <--- Не забываем
    case 3:
        $data['theme'] = 'мероприятие';
        break; // <--- Не забываем
}


К тому же...
foreach ($row as &$data) {
   // ...     
}
unset($data);

После прохода циклом используя ссылку, не забывайте удалять её после.
Ответ написан
Ваш ответ на вопрос

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

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