Добрый день. Имеется следующий код:
https://pastebin.com/ia2Qw8bN
Суть этого кода - перебираем товары из 3-х инфоблоков [ELKO, Treolan и OCS], объединяем их в единый инфоблок [Market].
В каждом из циклов добавляем товар, если его нет в системе (строка - 115), иначе обновляем свойства товара (строка - 118), строки кода предоставил для перебора товаров инфоблока ELKO, остальные циклы практически одинаковые. Свойства товаров записаны в переменную $arLoadProductArray.
Перейдём плавно к моей проблеме. Обратим внимание на самодельную функцию searchElementArr и переменные $articul и $search_id. Именно они используются в условии и функции searchElementArr. Более конкретно - я ранее говорил, что на строке 115 (для ELKO) мы добавляем товаров в случае, если его нет в системе, чтобы это проверить, мы обращаемся к переменной $search_id, которая является вызовом функции searchElementArr - она ищет id товара в системе Bitrix по следующим параметрами ("КОД_СВОЙСТВА_ПО_КОТОРОМУ_ИЩЕМ", "ЗНАЧЕНИЕ_СВОЙСТВА", "МАССИВ_ГДЕ_ИЩЕМ"). Во всех циклах кодом свойства, в котором ищем, является "65", значение свойства - артикул, который в зависимости от цикла (инфоблока) меняется, то бишь артикул берётся из того или иного инфоблока (который перебираем) и наконец массивом, где ищем эти артикулы, является $marketArr - выборка всех товаров из инфоблока Market. Запрос на выборку элементов в моём коде происходит один раз (строка - 52). При этом в каждом цикле у меня идёт добавление товаров и по идее нужно обновлять каждый раз массив $marketArr (делать запрос на выборку), чтобы производить корректно поиск в нём артикулов (так как мы не знаем данных о новодобавленных товарах, потому что массив статичный), но проблема в том, что при каждом запросе на выборку идёт запрос в базу данных, чтобы получить заветные элементы из инфоблока.
Я данную проблему решил следующим образом - так как массив $marketArr статичный, то для обновления массив я при каждом добавлении товара:
я добавляю данный товар и в массив $marketArr функцией array_push. Где условие на то, что артикула такого не нашлось я записываю как бы изменение товара в массиве:
, где сперва перебираю массив $marketArr, ищу элемент с найденным ID товара (переменная $search_id), удалять данный товар из массива (unset), записываю новый товар в массив функцией array_push.
Примеры массивов
ниже:
Один из товаров в массиве ELKO
Array
(
[IBLOCK_NAME] => ELKO
[ID] => 512552
[NAME] => Ноутбук X540MB PMD-N5000 15" 4GB 500GB X540MB-GQ079 ASUS
[IBLOCK_SECTION_ID] => 10953
[PROPERTY_22_VALUE] => 90NB0IQ1-M01110
[PROPERTY_22_VALUE_ID] => 10820458
[PROPERTY_3_VALUE] =>
[PROPERTY_3_VALUE_ID] =>
[PROPERTY_31_VALUE] =>
[PROPERTY_31_VALUE_ID] =>
[PROPERTY_25_VALUE] => 23770
[PROPERTY_25_VALUE_ID] => 10820460
[PROPERTY_27_VALUE] => 2
[PROPERTY_27_VALUE_ID] => 10820461
[PROPERTY_19_VALUE] => 1266489
[PROPERTY_19_VALUE_ID] => 10820455
[PROPERTY_7_VALUE] =>
[PROPERTY_7_VALUE_ID] =>
[PROPERTY_1_VALUE] =>
[PROPERTY_1_VALUE_ID] =>
[PROPERTY_39_VALUE] =>
[PROPERTY_39_VALUE_ID] =>
[PROPERTY_30_VALUE] =>
[PROPERTY_30_VALUE_ID] =>
[PROPERTY_65_VALUE] =>
[PROPERTY_65_VALUE_ID] =>
)
Один из товаров в массиве Treolan
Array
(
[IBLOCK_NAME] => Treolan
[ID] => 351947
[NAME] => ASUS Vivobook XMAS X540MB-GQ079 Pentium N5000/4Gb/500Gb HDD/15.6"HD (1366x768)/NVIDIA GeForce MX110 2Gb/DVD-RW/WiFi/BT/Cam/ENDLESS/2Kg/Black
[IBLOCK_SECTION_ID] => 11248
[PROPERTY_22_VALUE] =>
[PROPERTY_22_VALUE_ID] =>
[PROPERTY_3_VALUE] => 90NB0IQ1-M01110
[PROPERTY_3_VALUE_ID] => 7147014
[PROPERTY_31_VALUE] =>
[PROPERTY_31_VALUE_ID] =>
[PROPERTY_25_VALUE] =>
[PROPERTY_25_VALUE_ID] =>
[PROPERTY_27_VALUE] =>
[PROPERTY_27_VALUE_ID] =>
[PROPERTY_19_VALUE] =>
[PROPERTY_19_VALUE_ID] =>
[PROPERTY_7_VALUE] => 24171.00
[PROPERTY_7_VALUE_ID] => 7147018
[PROPERTY_1_VALUE] => 053001/1894
[PROPERTY_1_VALUE_ID] => 7147012
[PROPERTY_39_VALUE] =>
[PROPERTY_39_VALUE_ID] =>
[PROPERTY_30_VALUE] =>
[PROPERTY_30_VALUE_ID] =>
[PROPERTY_65_VALUE] =>
[PROPERTY_65_VALUE_ID] =>
)
Один из товаров в массиве OCS
Array
(
[IBLOCK_NAME] => OCS
[ID] => 480805
[NAME] => Ноутбуки
[IBLOCK_SECTION_ID] => 13165
[PROPERTY_22_VALUE] =>
[PROPERTY_22_VALUE_ID] =>
[PROPERTY_3_VALUE] =>
[PROPERTY_3_VALUE_ID] =>
[PROPERTY_31_VALUE] => 90NB0IQ1-M01110
[PROPERTY_31_VALUE_ID] => 10220466
[PROPERTY_25_VALUE] =>
[PROPERTY_25_VALUE_ID] =>
[PROPERTY_27_VALUE] =>
[PROPERTY_27_VALUE_ID] =>
[PROPERTY_19_VALUE] =>
[PROPERTY_19_VALUE_ID] =>
[PROPERTY_7_VALUE] =>
[PROPERTY_7_VALUE_ID] =>
[PROPERTY_1_VALUE] =>
[PROPERTY_1_VALUE_ID] =>
[PROPERTY_39_VALUE] => 23095.000000000000
[PROPERTY_39_VALUE_ID] => 10220472
[PROPERTY_30_VALUE] => 1000497541
[PROPERTY_30_VALUE_ID] => 10220465
[PROPERTY_65_VALUE] =>
[PROPERTY_65_VALUE_ID] =>
)
Данный 3 товаров из разных инфоблоков (ELKO, Treolan, OCS) имеют одинаковый артикул 90NB0IQ1-M01110.
Данные товары должны объединиться в единый и сохранится в итоговый инфоблок Market со следующей структурой в массиве $marketArr:
Товар в итоговом массиве Market
Array
(
[ID] => КАКОЙ-ТО_ID_В_СИСТЕМЕ_BITRIX
[NAME] => ИМЯ_ТОВАРА
[IBLOCK_SECTION_ID] => ID_РАЗДЕЛА_К_КОТОРОМУ_ОТНОСИТСЯ_ТОВАР
[PROPERTY_22_VALUE] => 90NB0IQ1-M01110
[PROPERTY_3_VALUE] => 90NB0IQ1-M01110
[PROPERTY_31_VALUE] => 90NB0IQ1-M01110
[PROPERTY_25_VALUE] => 23770
[PROPERTY_27_VALUE] => 2
[PROPERTY_19_VALUE] => 1266489
[PROPERTY_7_VALUE] => 24171.00
[PROPERTY_1_VALUE] => 053001/1894
[PROPERTY_39_VALUE] => 23095.000000000000
[PROPERTY_30_VALUE] => 1000497541
[PROPERTY_65_VALUE] => 90NB0IQ1-M01110
)
Но в итоге, когда выполняется скрипт, товары не объединяются в один, а создаются друг под другом (то есть в итоге получается 3 товара в итоговом инфоблоке Market с разными свойствами):
Хотя моя модель с добавлением и изменением товара - не только идёт запись в БД, но и в массив $marketArr, работает верно. Вот код примера работы этой модели:
https://pastebin.com/YQQNYVrS
Результат этого кода:
Arr1 |
Товар добавлен [art] => 546436456
Товар добавлен [art] => 7683435
Arr2 |
Товар изменён [art] => 546436456
Товар добавлен [art] => 76653834543283435
Arr3 |
Товар изменён [art] => 546436456
Товар добавлен [art] => 45435233
Итоговый масив Arr |
Array
(
[0] => Array
(
[ID] => 546436456
)
[1] => Array
(
[ID] => 7683435
)
[2] => Array
(
[ID] => 76653834543283435
)
[3] => Array
(
[ID] => 45435233
)
)
То бишь сначала добавляется товар со свойством [art] => 546436456, а уже в следующих циклах, при нахождении данного [art] идёт изменение товара.
Почему же такого не происходит с товарами из инфоблоков (ELKO, OCS и Treolan), которые должны объединяться в один и идти в инфоблок Market. Повторюсь, на данный момент, товары не объединяются а каждый товар добавляется со своими свойствами.