@distorter

Кек правильно выбрать единственный элемент массива, который тоже является массивом?

Задача - выводить дополнительные изображения для товара. Данные каждого изображения являются массивом и хранятся в общем для всех изображений массиве - FILE_VALUE:

$arResult["DISPLAY_PROPERTIES"]["MORE_PHOTO"]["FILE_VALUE"]

Когда изображений несколько, например 2, в FILE_VALUE хранится массив вида (для удобства сократил количество свойств):

Array ( [0] => Array ( [ID] => 64 [HEIGHT] => 500 [WIDTH] => 950 [FILE_SIZE] => 144931 [CONTENT_TYPE] => image/jpeg [SRC] => /1.jpg ) [1] => Array ( [ID] => 65 [HEIGHT] => 500 [WIDTH] => 950 [FILE_SIZE] => 111784 [CONTENT_TYPE] => image/jpeg [SRC] => /2.jpg ) )

Он отлично обходится циклом:

<? foreach ($arResult["DISPLAY_PROPERTIES"]["MORE_PHOTO"]["FILE_VALUE"] as $PHOTO): ?> 
<img  src="<?=$PHOTO["SRC"]?>"   />
<? endforeach; ?>


Но, когда картинка всего одна, то в FILE_VALUE хранится сразу массив с единственным элементом:

Array ( [ID] => 64 [HEIGHT] => 500 [WIDTH] => 950 [FILE_SIZE] => 144931 [CONTENT_TYPE] => image/jpeg [SRC] => /1.jpg )

И указанный выше цикл дает неожиданный результат - выводит тег столько раз, сколько элементов в массиве, а в атрибут src возвращает первый символ значения свойства:

<img src="6" />
<img src="5" />
<img src="9" />
<img src="1" />
<img src="/" />


ВОПРОС:
Как правильно описать исключение для случая, когда картинка всего одна?
  • Вопрос задан
  • 889 просмотров
Решения вопроса 2
Melkij
@Melkij
PostgreSQL DBA
Но, когда картинка всего одна, то в FILE_VALUE хранится сразу массив

Нормальное решение - поправить вот эту логику заполнения.
Если должна быть коллекция - значит должна быть коллекция. И пофиг, из десяти, одного элемента или вовсе пустая.

И указанный выше цикл дает неожиданный результат

Хочу напомнить, что даже PHP 5.4 живёт последние 10 дней. Обновляйте PHP.
Я всё-таки надеюсь, что вы даже не пытаетесь что-то разрабатывать с выключенным выводом ошибок. А начиная с 5.4.0 обращение к строке как массиву по строковому ключу провоцирует E_WARNING. Но первый байт (по нулевому смещению. т.е.) при этом всё ещё выводится.
Ответ написан
@vldud
if(isset($arResult["DISPLAY_PROPERTIES"]["MORE_PHOTO"]["FILE_VALUE"][0])){
...
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Express777
@Express777
Если обобщить все вышесказанное, то получиться вот такой код:
$arMoreFoto = $arResult["DISPLAY_PROPERTIES"]["MORE_PHOTO"]["FILE_VALUE"];
if ( !empty($arMoreFoto["SRC"]) ){
    $arMoreFoto  = array( $arMoreFoto );
}

<? foreach ($arMoreFoto   as $PHOTO) {?> 
<img  src="<?=$PHOTO["SRC"]?>"   />
<? } ?>

Плюс этого то, что вам даже не придется менять ваш foreach. В него всегда будет приходить коллекция.
Конечно ваш foreach маленький, и в принципе можно было бы дублировать его в if-else. Но Я не приветствую любое дублирование. При том часто бывают foreach-и со сложной версткой и структурой.

Если используете IDE советую отказатсья от endforeach и от любого альтернативного синтактиса end* и использовать фигурные скобки.

if(isset($arResult["DISPLAY_PROPERTIES"]["MORE_PHOTO"]["FILE_VALUE"][0])){
...
}

ммм.. этот код всегда будет возвращать true если массив не пустой. То есть им нельзя проверить вложенность массива.
Ответ написан
Комментировать
Перед foreach сделайте if, которой функцией count (https://secure.php.net/manual/ru/function.count.php) будет проверять количество элементов в массиве. Если более 1, то ваш вариант, который приведен в вопросе, иначе тупо обращайтесь к $arResult["DISPLAY_PROPERTIES"]["MORE_PHOTO"]["FILE_VALUE"][0].

P.S. Возможно есть вариант более правильный, подождите других ответов)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽