У меня есть следующие элементы массива:
[{
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() в этом случае?
Разве мой более современный и краткий ответ не оказался для вас полезным? @Ллойд






Когда 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? Это относится к тому, как числовые подстроки влияют на порядок сортировки, и я бы не ожидал цифр в именах.
В этом сценарии не имеет значения, какому спутнику я дарю SORT_FLAG_CASE. В любом случае, честный крик, я изменил его на SORT_STRING.
Вероятно, вам придется написать свой собственный алгоритм сравнения. Это проблема?