У меня есть коллекция с такими вложенными коллекциями, как:
+
+--- 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), но эффект тот же.
Сортировка выглядит нормально, поле name содержит строки и отсортировано таким образом.
Да, но строка начинается с числа, что может привести к его превращению в целое число, 1.






Может случиться так, что поскольку ваши значения начинаются с целого числа, они превращаются в целое число. Это означает, что отбрасывается все, что находится после первого нечислового символа. В вашем случае у вас осталось 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.
Поскольку вы смешиваете и то, и другое, вам нужно решение, подобное уже приведенному.
потому что это выглядело как струна ...