PHP — usort() с частичной чувствительностью к регистру

У меня есть следующие элементы массива:

[{
    first_name: 'Rebecca'
}, {

    first_name: 'amy'
}, {
    first_name: 'Amy'
}, {

    first_name: 'stacy'
}]

Я хочу, чтобы массив был отсортирован в алфавитном порядке в соответствии со свойством first_name. В случае коллизии, когда свойства first_name совпадают (т. е. amy и Amy), я хочу, чтобы значение с заглавной буквы было первым.

В приведенном выше массиве отсортированные значения должны быть следующими:

[{
    first_name: 'Amy'
}, {

    first_name: 'amy'
}, {
    first_name: 'Rebecca'
}, {

    first_name: 'stacy'
}]

Это текущий обычай usort() Я использую:

usort($users, function($a, $b){
    $first_name_compare = strcasecmp($a['first_name'], $b['first_name']);
    return $first_name_compare;
});

strcasecmp() предположительно нечувствителен к регистру, но я заметил, что это непоследовательно. В приведенном выше примере массива strcasecmp() иногда возвращает amy раньше Amy и наоборот.

Что такое strcasecmp() в этом случае?

Вероятно, вам придется написать свой собственный алгоритм сравнения. Это проблема?

KIKO Software 28.04.2024 22:21

Разве мой более современный и краткий ответ не оказался для вас полезным? @Ллойд

mickmackusa 29.04.2024 06:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Когда strcasecmp() возвращается 0, вам следует вернуться к strcmp().

usort($users, function($a, $b){
    $first_name_compare = strcasecmp($a['first_name'], $b['first_name']);
    if ($first_name_compare == 0) {
        $first_name_compare = strcmp($a['first_name'], $b['first_name']);
    }
    return $first_name_compare;
});

Сначала сравнивайте без учета регистра, затем, чтобы разорвать связи, сравнивайте с учетом регистра.

?: — это оператор Элвиса: если значение в первой оценке равно 0 (ложь), то происходит возврат к оценке второго сравнения.

Код: (Демо)

usort(
    $users,
    fn($a, $b) => strcasecmp($a['first_name'], $b['first_name'])
        ?: strcmp($a['first_name'], $b['first_name'])
);
var_export($users);

Другой жизнеспособный подход — изолировать значения столбцов в виде плоского массива, сортировать без учета регистра, а затем сортировать с учетом регистра: (Демо)

$firstNames = array_column($users, 'first_name');
array_multisort($firstNames, SORT_STRING | SORT_FLAG_CASE, $firstNames, $users);
var_export($users);

Почему SORT_NATURAL? Это относится к тому, как числовые подстроки влияют на порядок сортировки, и я бы не ожидал цифр в именах.

Barmar 29.04.2024 17:13

В этом сценарии не имеет значения, какому спутнику я дарю SORT_FLAG_CASE. В любом случае, честный крик, я изменил его на SORT_STRING.

mickmackusa 29.04.2024 22:48

Другие вопросы по теме