我有类似子集合的集合:
+
+--- 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)
,但效果相同。
答案 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.
由于您将两者混合使用,因此需要一种已经给出的解决方案。