Задать вопрос
@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="/" />


ВОПРОС:
Как правильно описать исключение для случая, когда картинка всего одна?
  • Вопрос задан
  • 898 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 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. Возможно есть вариант более правильный, подождите других ответов)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы