Laravel - sortBy () не работает должным образом

У меня есть коллекция с такими вложенными коллекциями, как:

+
+--- name: 1a8 Lorem Ipsum
+
+--- name: 1a2 Lorem Ipsum
+
+--- name: 1a10 Lorem Ipsum

и теперь я хочу отсортировать его по этому имени:

$collection->sortBy('name')

Должен быть:

1a2 Lorem Ipsum
1a8 Lorem Ipsum
1a10 Lorem Ipsum

но я получаю:

1a10 Lorem Ipsum
1a2 Lorem Ipsum
1a8 Lorem Ipsum

Почему? Я тоже пробовал с $collection->sortBy('name', SORT_NATURAL, false), но эффект тот же.

потому что это выглядело как струна ...

Dieter Kräutl 22.08.2018 09:10

Сортировка выглядит нормально, поле name содержит строки и отсортировано таким образом.

Jerodev 22.08.2018 09:12

Да, но строка начинается с числа, что может привести к его превращению в целое число, 1.

Tschallacka 22.08.2018 09:13
Стоит ли изучать 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 и хотите разрабатывать...
2
3
829
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Может случиться так, что поскольку ваши значения начинаются с целого числа, они превращаются в целое число. Это означает, что отбрасывается все, что находится после первого нечислового символа. В вашем случае у вас осталось 3 1

Возможно, вы захотите использовать собственный обратный вызов сортировки, который реализует strnatcmp

$collection->sort(function($a, $b) {
   // using 3 = for type and value comparisan.
   if ($a->name === $b->name) {
      return 0;
   };
   return strnatcmp($a->name, $b->name);
});

Решение уже есть в ответе @Tschallacka. Если вы хотите объяснить, почему это происходит, позвольте мне объяснить.

Функция sortBy принимает string. Сортировка строк анализируется столбец за столбцом (позиция символа - позиция символа). Сортировка целочисленного или числового типа анализируется по значению.

Итак, если мы попытаемся отсортировать: 1,2,3,4,5,6,7,8,9,10,11,12,13... как строку, мы получим что-то вроде: 1,10,11,..2,20,21.

Поскольку вы смешиваете и то, и другое, вам нужно решение, подобное уже приведенному.

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