laravel-sortBy()无法正常工作

时间:2018-08-22 07:08:29

标签: php laravel laravel-5

我有类似子集合的集合:

+
+--- 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),但效果相同。

2 个答案:

答案 0 :(得分: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);
});

答案 1 :(得分:1)

@Tschallacka已在解决方案中。如果您想解释为什么会发生,让我解释一下。

函数sortBy正在接收string。字符串排序是逐列分析的(char位置按char位置)。整数或数字类型排序,按值进行分析。

因此,如果我们尝试将1,2,3,4,5,6,7,8,9,10,11,12,13...排序为字符串,则会得到类似1,10,11,..2,20,21.

的信息

由于您将两者混合使用,因此需要一种已经给出的解决方案。