@yura_born

Как в php usort() вывести определенное значение самым первым?

Необходимо отсортировать многомерный массив, но что бы сначала была Москва потом Санкт-Петербург, а уже потом все остальные города по алфавиту.
Делаю вот так
usort(IRD::$domains, "compare"); // Сортировка

                        /* Функция для сортировки */
                        function compare ($v1, $v2) {
                            if ($v1=='Москва')return 9999;
                            elseif ($v1=='Санкт-Петербург')return 9998;
                            elseif ($v1["region"] == $v2["region"]) return 0;
                            return ($v1["region"] < $v2["region"])? -1: 1;
                        }


Массив сортируется но только по алфавиту..... подскажите как сделать что бы Москва и Питер впереди были
  • Вопрос задан
  • 97 просмотров
Решения вопроса 2
@d-sem
function compare ($v1, $v2) {
    if ($v1=='Москва' && $v2='Санкт-Петербург') return -1;
    if ($v2=='Москва' && $v1='Санкт-Петербург') return 1;
    if ($v1=='Москва' && $v2!='Санкт-Петербург') return -1;
    if ($v1=='Санкт-Петербург' && $v2!='Москва') return -1;
    if ($v1!='Санкт-Петербург' && $v2='Москва') return 1;
    if ($v1 == $v2) return 0;
    return ($v1 < $v2)? -1 : 1;
}
Ответ написан
delphinpro
@delphinpro Куратор тега PHP
frontend developer
$array = [
    'Д',
    'А',
    'Б',
    'В',
    'Г',
    'Ж',
    'Ф',
    'Х',
    'О',
    'П',
    'Р',
    'Санкт-Петербург',
    'Т',
    'З',
    'У',
    'Л',
    'Москва',
    'Н',
    'Е',
];

$first = [
    'Москва',
    'Санкт-Петербург',
];

usort($array, function($a, $b) use ($first) {
    foreach ($first as $item) {
        if ($a == $item) return -1;
        if ($b == $item) return 1;
    }
    if ($a == $b) return 0;
    return $a < $b ? -1 : 1;
});

print_r($array);


Элементы, указанные в массиве $first будут выведены в начале списка, и именно в том же порядке что указаны.

То есть, если задать
$first = [
    'Санкт-Петербург',
    'Москва',
];

то Питер будет первым.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽