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

Дублирование объектов

00 голосов
6
Здравствуйте
делаю : $rsElements = CIBlockElement::GetList($arSort, $mass, false, $arNavParams, $arSelect);
в итоге $rsElements выводит один и тот же элемент по нескольку раз.
В базе данных дублирования нет.
Что это может быть?
спросил 07 Сен, 13 от Fierce88 (440 баллов)

6 Ответы

00 голосов
Это значит что у вас есть множественные свойства.
В таком случае данный алгоритм работает приблизительно так:
1. Берется первый элемент с базы, плюс все его свойства.
2. Если у элемента есть множественное свойство, то идет дубль, но с другим свойством.
и т.д.

Пример.
Есть элемент книга. У нее есть множественное свойство авторы, тип строка.
"Книга"
Авторы: Иванов, Петров.
Тогда в выборке будет:
- "Книга", Иванов
- "Книга", Петров

Чтобы избежать дублей - в цикле надо проверять идет ли дубль (по ID можно увидеть). И если идет, то не новый элемент массива делать, а пристыковывать к предыдущему:
- "Книга", Иванов
- - Петров
ответил 07 Сен, 13 от Arn4 (2,140 баллов)
00 голосов
Я патался избавиться от этих дублируемых элементов при помощи функции array_unique но не помогает.
уменя небольшой опыт в битриксе. если не трудно как это будет выглядеть примерно?
ответил 01 Дек, 13 от Fierce88 (440 баллов)
00 голосов
Лучше не парьтесь и используйте примерно следующее:
Код
$rsElement = CIBlockElement::GetList($arSort, $arFilter, false, $arNavParams, $arSelect);
$arResult["ITEMS"] = array();
while($obElement = $rsElement->GetNextElement())
{
    $arItem = $obElement->GetFields();
    $arItem["PROPERTIES"] = $obElement->GetProperties();
    ...
}
ответил 13 Март, 14 от Arn4 (2,140 баллов)
00 голосов
в таком случае у нас получается большое количество заросов. вся вышеописанная проблема результат оптимизации component.php, количество запросов к базе уменьшилось(21<2500). осталось убрать дубли. ваш вариант породит множество запросов.
ответил 04 Июль, 14 от Fierce88 (440 баллов)
00 голосов
Цитата
омен пишет:
количество запросов к базе уменьшилось(21<2500).

Да уж...


Собственно там знаний Битрикса и не требуется. PHP-задачка - сгруппировать массив.
Вот что первое пришло в голову. Решение не универсально, так как каждое свойство надо рассматривать.
Код
<?
$arResult["ITEMS"] = array();
$arSelect = array("NAME", "PREVIEW_TEXT", "PROPERTY_AUTHORS");
$rsElements = CIBlockElement::GetList($arSort, $mass, false, $arNavParams, $arSelect); 
while ($arElements = $rsElements->GetNext())
{
   $arResult["ITEMS"][$arElements["ID"]] = $arElements;
   $arResult["ITEMS"][$arElements["ID"]]["AUTHORS"][] = $arElements["PROPERTY_AUTHORS_VALUE"];
}
?>
ответил 04 Ноя, 14 от Arn4 (2,140 баллов)
00 голосов
А на инфоблоки+ нельзя перевести данный инфоблок?
ответил 03 Март, 15 от Delp (7,220 баллов)

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

0 голосов
3 ответов
спросил 05 Фев, 14 от Maximus1 (380 баллов)
0 голосов
2 ответов
0 голосов
7 ответов