Изменить значения вложенного массива в нескольких полях с помощью цикла foreach

0

Попытка выполнить цикл через массив (результаты запроса таблицы mysql db), найти четыре разных поля и добавить префикс.

У меня есть четыре версии изображений - полный размер, меди, малый, большой палец - как поля таблицы (mysql). Значения - это имена файлов. Я хочу префикс https://... каждому, чтобы у меня был полный адрес для каждого изображения.

Мой запрос возвращает ассоциативный массив ($myArray). Цикл foreach ищет соответствие по $key слову с полем изображения, а если true показывает текущее значение, то добавляет префикс, а затем отображает новое значение. То, что отображается как "Новое значение", включает префикс, так что часть кода работает должным образом.

Однако, когда я отображаю $myArray после этого, "измененные" значения не изменяются. Это только оригинальные имена файлов без префикса.

Я не могу понять, как применить новое значение к массиву.

Вот мой код:

$prefix = 'example.com/assets/images/';

foreach($myArray as $key => $value) {

  if ($key == 'image_full_size') {
     echo 'Current value: ' . $value['image_full_size'] . '<br>';
     $value['image_full_size'] = $prefix . $value['image_full_size'];
     echo 'New value: ' . $value['image_full_size'] . '<br>';
  }

  if ($key == 'image_med') {
     echo 'Current value: ' . $value['image_med'] . '<br>';
     $value['image_med'] = $prefix . $value['image_med'];
     echo 'New value: ' . $value['image_med']. '<br>';
  }

  if ($key == 'image_small') {
     echo 'Current value: ' . $value['image_small'] . '<br>';
     $value['image_small'] = $prefix . $value['image_small'];
     echo 'New value: ' . $value['image_small']. '<br>';
  }

  if ($key == 'image_thumb') {
     echo 'Current value: ' . $value['image_thumb'] . '<br>';
     $value['image_thumb'] = $prefix . $value['image_thumb'];
     echo 'New value: ' . $value['image_thumb']. '<br>';
  }
}

Я был бы признателен за любую помощь в поиске моей ошибки.

Первые две записи из массива:

Array
(
   [0] => Array
       (
           [id] => 1
           [laser_series] => GTO FLX
           [laser_model] => GTO/FLX01
           [laser_color] => red
           [price] => 118.75
           [image_full_size] => example.com/assets/images/laser-pistol/gto-flx01_black_red_1080x720.png
           [image_med] => example.com/assets/images/laser-pistol/gto-flx01_red_med.png
           [image_small] => example.com/assets/images/laser-pistol/gto-flx01_red_small.png
           [image_thumb] => example.com/assets/images/laser-pistol/gto-flx01_red_thumb.png
           [ad_blurb] => Custom-designed to fit this brand and model. The GTO/FLX series laser is the most technologically-advanced laser sight available for this popular pistol.
           [feature01] => Grip-Touch Activation by using FLX
           [feature02] => Side-Touch Activation without FLX
           [feature03] => Ultra-bright 635nm red laser
           [special_message] => 
           [mfr_name] => Kel-Tec
       )

   [1] => Array
       (
           [id] => 3
           [laser_series] => GTO FLX
           [laser_model] => GTO/FLX02
           [laser_color] => red
           [price] => 118.75
           [image_full_size] => gto-flx02_black_red_1080x720.png
           [image_med] => gto-flx02_red_med.png
           [image_small] => gto-flx02_red_small.png
           [image_thumb] => gto-flx02_red_thumb.png
           [ad_blurb] => Custom-designed to fit this brand and model. The GTO/FLX series laser is the most technologically-advanced laser sight available for this popular pistol.
           [feature01] => Grip-Touch Activation by using FLX
           [feature02] => Side-Touch Activation without FLX
           [feature03] => Ultra-bright 635nm red laser
           [special_message] => 
           [mfr_name] => Kel-Tec
       )
)
Теги:
arrays
foreach

1 ответ

0
Лучший ответ

Цикл foreach ищет соответствие по ключевому слову с полем изображения, а если true показывает текущее значение, то добавляет префикс, а затем отображает новое значение. То, что отображается как "Новое значение", включает префикс, так что часть кода работает должным образом.

Нет - он работает не так, как ожидалось. Это просто выглядит.

Клавиши строк являются числовыми. Но вы сравниваете их с такими строками: $key == 'image_full_size'. В этом случае PHP, кажется, передает строку в число, и это будет 0. Таким образом, условие истинно, только если $key равен 0. Вы можете увидеть это поведение здесь: http://rextester.com/XDORW8182

Именно по этой причине он работает только для первой строки, где ключ равен 0.

Таким образом, ваша попытка ошибочна. И рабочее решение не так сложно:

foreach($myArray as $key => $row) {
    $myArray[$key]['image_full_size'] = $prefix . $row['image_full_size'];
    $myArray[$key]['image_med']       = $prefix . $row['image_med'];
    $myArray[$key]['image_small']     = $prefix . $row['image_small'];
    $myArray[$key]['image_thumb']     = $prefix . $row['image_thumb'];
}

Демо: http://rextester.com/JEA91624

Оригинальный ответ:

В

foreach($myArray as $key => $value) {
     $value['image_full_size'] = $prefix . $value['image_full_size'];
}

$value - это (локальная) копия $myArray[$key] и вы меняете эту копию. Если вы хотите изменить исходную строку в $myArray вы должны получить эту строку с помощью $key:

$myArray[$key]['image_full_size'] = $prefix . $value['image_full_size'];

Другой способ - получить доступ к строке по ссылке с помощью

foreach($myArray as $key => &$value) {...}

Но это может иметь некоторые нежелательные побочные эффекты, поэтому вам лучше избегать этого.

  • 0
    Спасибо, Пол! Новые значения отображаются в $ myArray, но только для первой записи. Видимо мой цикл foreach не зацикливается. Вы знаете, почему это происходит?
  • 0
    @ JimB814 Пожалуйста, опубликуйте пример $myArray (в вопросе). Используйте var_export($myArray) . Посмотрев на ваш код ближе, я не думаю, что понимаю структуру массива.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню