Попытка выполнить цикл через массив (результаты запроса таблицы 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
)
)
Цикл 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) {...}
Но это может иметь некоторые нежелательные побочные эффекты, поэтому вам лучше избегать этого.
$myArray
(в вопросе). Используйтеvar_export($myArray)
. Посмотрев на ваш код ближе, я не думаю, что понимаю структуру массива.