Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Проблема с отпимизацией скрипта

00 голосов
2
Была задача реализовать торговый каталог теплиц для интернет магазина. Смысл состоит в том, что мы имеем два инфоблока, в одном из которых содержится перечень теплиц, а в другом выгрузка из 1С каталога составных частей для этих теплиц. Получается, что готовая теплица состоит из составных частей, которые привязываются к ней через свойство. Каждая составная часть имеет несколько типов цен, которые выводятся в зависимости от региона. И так, суть проблемы... Чтобы вывести общую стоимость хотя бы одной теплицы, нам надо перебрать все составные части этой теплицы. Так как в массиве элемента "Теплица" (в шаблоне вывода элементов инфоблока) $arElement выводятся id-шники связанных элементов, мы можем получить цену каждой составной части. Сделав поправку на регион и на кол-во связанных элементов я запускаю цикл, который достаёт цену каждой составной части и плюсует её в переменную общей суммы. И всё бы ни чего, но когда на странице выводится не одна теплица, а к примеру 27... количество запросов к базе переваливает за 227, а это не комельфо. Собственно как быть и что может помочь?

Вот часть этого ужасного кода:
Код
// --- Смотрим регион
  $arSelect = Array("ID","NAME", "PROPERTY_TYPE_PRICE");
  $arFilter = Array("IBLOCK_ID"=>9, "ID"=>$_SERVER["city"]);
  $arRes = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
  if($ob = $arRes->GetNextElement()):
    $arFields1 = $ob->GetFields();
  endif;

// --- Считаем общую цену

 for($i=0; $i<count($arElement["PROPERTIES"]["count"]["VALUE"]); $i++):
    $arSelect = Array("ID","NAME");
    $arFilter = Array("IBLOCK_ID"=>30, "ID"=>$arElement["PROPERTIES"]["count"]["VALUE"][$i]);
    $arRes = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
    if($ob = $arRes->GetNextElement()):

        $arFields2 = $ob->GetFields();
   $arOutput["NAME"][$i] = $arFields2["NAME"];
        $arOutput["QUANTITY"][$i] = $arElement["PROPERTIES"]["count"]["DESCRIPTION"][$i];
      
   $arPrice = GetCatalogProductPrice($arFields2["ID"], $arFields1["PROPERTY_TYPE_PRICE_VALUE"]);
   $arOutput["PRICE"][$i] = $arPrice["PRICE"];
   $arOutput["ALL_PRICE"] +=$arOutput["PRICE"][$i]*$arOutput["QUANTITY"][$i];
    endif;
 endfor;
спросил 11 Июль, 13 от Amellia (160 баллов)

2 Ответы

00 голосов
Цитата
Stalin пишет:
Собственно как быть и что может помочь?


Разбить на массивы, потом по ID соединить в один по ключам или значениям, там нужно конкретнее смотреть.

PS

Вам с этим реально удобно?
Код
 endif;
endfor; 
ответил 11 Июль, 13 от Lekar (2,220 баллов)
00 голосов
"endif" и "endfor" начал использовать после того, как стал часто сталкиваться с ситуацией, когда внутри цикла или условия используется в основном html код и следовательно приходится использовать теги <? и ?>. На мой взгляд запись вида <?endfor;?> красивее и понятней записи <?}?>. Во всяком случае для меня.)
ответил 28 Авг, 13 от Amellia (160 баллов)

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

0 голосов
1 ответ
спросил 16 Март, 15 от аноним
0 голосов
1 ответ
спросил 06 Окт, 13 от аноним
0 голосов
3 ответов
спросил 08 Май, 14 от HuT (100 баллов)
0 голосов
0 ответов
спросил 06 Май, 14 от Ris (280 баллов)