Шаг 1: Получаем первые 20 элементов,
Шаг 2: Получаем 100 случайных элементов убрав из них 20 полученные в Шаге 1,
Шаг 3: Получаем оставшиеся элементы убрав из них 120 полученные в результате Шаг 1 и Шаг 2,
\Bitrix\Main\Loader::includeModule('iblock');
// Шаг 1: Получаем первые 20 элементов,
$arSelect = Array("ID","NAME","DETAIL_PAGE_URL");
$nPageSize = Array("nPageSize" => 20);
$arSort = Array("SORT" => "ASC");
$arFilter = Array("IBLOCK_ID"=>IntVal($this->arParams['IBLOCK_ID']), "ACTIVE"=>"Y");
$res = CIBlockElement::GetList($arSort, $arFilter, false, $nPageSize, $arSelect);
$ALL_RESULT = [];
$IGNORE_IDS = [];
while($ob = $res->GetNextElement())
{
$GetFields = $ob->GetFields();
$IGNORE_IDS[] = $GetFields["ID"];
$ALL_RESULT[] = $GetFields;
}
// Шаг 2: Получаем 100 случайных элементов убрав из них 20 полученные в Шаге 1,
$nPageSize = Array("nPageSize" => 100);
$arSort = Array("RAND" => "ASC");
$arFilter = Array("!ID" => $IGNORE_IDS, "IBLOCK_ID"=>IntVal($this->arParams['IBLOCK_ID']), "ACTIVE"=>"Y");
$res = CIBlockElement::GetList($arSort, $arFilter, false, $nPageSize, $arSelect);
while($ob = $res->GetNextElement())
{
$GetFields = $ob->GetFields();
$IGNORE_IDS[] = $GetFields["ID"];
$ALL_RESULT[] = $GetFields;
}
// Шаг 3: Получаем оставшиеся элементы убрав из них 120 полученные в результате Шаг 1 и Шаг 2,
$nPageSize = Array();
$arSort = Array("ACTIVE_FROM" => "ASC");
$arFilter = Array("!ID" => $IGNORE_IDS, "IBLOCK_ID"=>IntVal($this->arParams['IBLOCK_ID']), "ACTIVE"=>"Y");
$res = CIBlockElement::GetList($arSort, $arFilter, false, $nPageSize, $arSelect);
while($ob = $res->GetNextElement())
{
$GetFields = $ob->GetFields();
$IGNORE_IDS[] = $GetFields["ID"];
$ALL_RESULT[] = $GetFields;
}
return $ALL_RESULT;