Очередность вывода записей из массива
Нужно сначала все банки на русском вывести, а потом все английском, сейчас выводит в алфавитном порядке, все как надо, но выводит сначала английский, а нужно наооборот, как можно реализовать?
// 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);