解决PHP和Java的sort排序一致

php排序sort($tmpArr, SORT_STRING)方式就会和java的Arrays.sort()结果一致了。

在把一段Java代码转php的时候发现使用默认sort这个函数会出行排序不一致情况,经查询需要修改第二个参数为字符串。
php默认的排序参数信息

sort(array &$array, int $flags = SORT_REGULAR): true
可选的第二个参数 flags 可以用以下值改变排序的行为:
排序类型标记:
SORT_REGULAR – 正常比较单元 详细描述参见 比较运算符 章节
SORT_NUMERIC – 单元被作为数字来比较
SORT_STRING – 单元被作为字符串来比较
SORT_LOCALE_STRING – 根据当前的区域(locale)设置来把单元当作字符串比较,可以用 setlocale() 来改变。
SORT_NATURAL – 和 natsort() 类似对每个单元以“自然的顺序”对字符串进行排序。
SORT_FLAG_CASE – 能够与 SORT_STRING 或 SORT_NATURAL 合并(OR 位运算),不区分大小写排序字符串。

SORT_STRING 排序方式的底层实现是 C 语言的 memcmp,它对两个字符串从前往后,按照逐个字节比较,一旦字节有差异,就终止并比较出大小。

而 SORT_REGULAR 会智能判断需排序对象的类型,如果两个字符串都是“纯数字”形式的字符串,会以比较整个字符串所代表的十进制整数、浮点数大小的形式进行排序。如果两个字符串不是“纯数字“形式的,才会和 SORT_STRING 一样。

因此,如果需要以字符串 strcmp 方式逐个字节从前往后比较来进行排序,在调用 php 的 sort 类函数的时候请务必使用 SORT_STRING 这个 flag,否则如果两个字符串都是”纯数字“形式的,就会按照它们所代表的数字大小进行排序。

此条目发表在服务器分类目录,贴了, 标签。将固定链接加入收藏夹。

发表回复