@DmitryNs

Вывод только уникальных значений массива?

Вывожу в select значения из свойств инфоблока
$region = [];
$arSelect = Array("ID", "IBLOCK_ID", "NAME", "PREVIEW_TEXT", "PREVIEW_PICTURE", "PROPERTY_*");
$arFilter = Array("IBLOCK_ID"=>1);
$res = CIBlockElement::GetList(Array(), $arFilter, $arSelect);
while ($ob = $res->GetNextElement()) {
    $arFields = $ob->GetFields();
    $arProps = $ob->GetProperties();
    $region[] = [
        'REGION' =>   $arProps['REGION']['VALUE'],
        'CITY' =>   $arProps['CITY']['VALUE']
    ];
}
$arResult['OFFICE_REGION'] = $region;

<?foreach ($arResult['OFFICE_REGION'] as $region):?>
<option value="<?=$region["REGION"]?>" data-city="<?=$region['CITY']?>">
<?=$region['REGION']?>
</option>
<?endforeach;?>

В таком виде в $region['REGION'] выводятся дубли. А мне нужно выводить только уникальные значения.
А если выводить через
$arPropValues = array();
$dbItems = CIBlockElement::GetList(array(), array('IBLOCK_ID' => 1, 'ACTIVE' => 'Y'), array('PROPERTY_REGION'));
while($arItem = $dbItems->GetNext(true, false)) {
    $arPropValues[] = $arItem['PROPERTY_REGION_VALUE'];
}

то выводится как надо -- только уникальные значения, но как в такой вариант прокинуть еще свойство "CITY"?
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
Вы хотите чего-то странного. У вас есть регионы, к региону привязано несколько городов (если бы город был один, то не было бы дублей). Что вы в таком случае хотите видеть в data-city для каждого региона?
Я понимаю, когда делают наоборот: выводят города и для каждого ещё сохраняют его регион, чтобы потом как-то эти данные обрабатывать. А вот какой сценарий у вас мне совершенно непонятно.

Предположим, туда нужно передать все города региона. Тогда код будет таким:
$locations = [];
$arSelect = Array("ID", "IBLOCK_ID", "NAME", "PREVIEW_TEXT", "PREVIEW_PICTURE", "PROPERTY_*");
$arFilter = Array("IBLOCK_ID"=>1);
$res = CIBlockElement::GetList(Array(), $arFilter, $arSelect);
while ($ob = $res->GetNextElement()) {
    $arProps = $ob->GetProperties();
    $region = $arProps['REGION']['VALUE'];
    $city = $arProps['CITY']['VALUE'];

    if (!array_key_exists($region, $locations)) {
        $locations[$region] = [];
    }

    if (!in_array($city, $locations[$region], true)) {
        $locations[$region][] = $city;
    }
}

<? foreach ($locations as $region => $cities): ?>
    <option value="<?=$region?>" data-cities="<?=implode('|', $cities)?>">
        <?=$region?>
    </option>
<? endforeach; ?>
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы