Очередность вывода записей из массива

Нужно сначала все банки на русском вывести, а потом все английском, сейчас выводит в алфавитном порядке, все как надо, но выводит сначала английский, а нужно наооборот, как можно реализовать?

 // Backend 
   $result = $this->sjsService->getFilials(); запрос к апи
    foreach ($result['result'] as $value) {
        $changeEng = preg_replace('/[x00-x7F]*/', NULL, $value['SHORTNAME']);
        $changeRus = preg_replace('/[^a-zA-Z0-9]/', NULL, $value['SHORTNAME']);
        $arrRu[$value['ISN']] = $changeEng;
        $arrEn[$value['ISN']] = $changeRus;
        sort($arrRu);
        sort($arrEn);
    }

 // Front

             <select class="field fillials" id='fillials' onchange="showBlock2()">
                            <option value="">--</option>
                            @foreach($arrRu as $key => $value)
                                <option value="{{$key}}">{{$value}}</option>
                            @endforeach
                            @foreach($arrEn as $key => $value)
                                <option value="{{$key}}"> {{$value}}</option>
                            @endforeach
                        </select>

Ответы (1 шт):

Автор решения: teran

разделите названия на русские и английские, отсортируйте обе части, сложите в один массив.

$titles = ["abc", "абв", "xyz", "иксигрекзед"];

$res = ['ru' => [], 'en' => []];
foreach ($titles as $t) {
    $lang = preg_match('/[а-яё]/ui', $t) ? 'ru' : 'en';
    $res[$lang][] = $t;
}

sort($res['ru']);
sort($res['en']);

$result = array_merge($res['ru'], $res['en']);
print_r($result);

Второй вариант - использовать usort. Сравнения надо проводить по двум уровням, язык и слова.

$lang = function($t){ 
    return preg_match('/[а-яё]/iu', $t) ? 'ru' : 'en'; 
    
};

usort($titles, function($a, $b) use (&$lang){
    $la = $lang($a);
    $lb = $lang($b);
    
    if ($la == $lb) return strcmp($a, $b);
    
    return $lb <=> $la;
});

print_r($titles);
→ Ссылка