标签搜索

php sort()与java Arrays.sort()的区别

basil
2023-06-06 / 194 阅读

背景

在对接一个OA系统的时候,加密方式只提供了java的例子,有个步骤需要对参数的数组进行排序,用的是Arrays.sort(),对接的时候用的是phpsort()函数,排序之后发现两边对不上
PHP代码

$arr = [4367604, 'XT-6a42ab94-9124-4c44-bbc2-5f56c6fcfd99', '2321c578da9446215fcefe12adf6e2nb', '647ea7db53a88', '1686022107'];
        sort($arr);
        var_dump($arr);

输出结果

array(5) {
  [0]=>
  string(32) "2321c578da9446215fcefe12adf6e2nb"
  [1]=>
  string(13) "647ea7db53a88"
  [2]=>
  string(39) "XT-6a42ab94-9124-4c44-bbc2-5f56c6fcfd99"
  [3]=>
  int(4367604)
  [4]=>
  string(10) "1686022107"
}

java代码

public static void main(String[] args) throws IOException {
        sha("4367604", "XT-6a42ab94-9124-4c44-bbc2-5f56c6fcfd99", "2321c578da9446215fcefe12adf6e2nb", "647ea7db53a88", "1686022107");
    }

    private static void sha(String... data) {
        Arrays.sort(data);
        System.out.println(Arrays.toString(data));
    }

输出结果

[1686022107, 2321c578da9446215fcefe12adf6e2nb, 4367604, 647ea7db53a88, XT-6a42ab94-9124-4c44-bbc2-5f56c6fcfd99]

通过对比可以发现排序后的结果不一致

区别

PHP array文档说明

sort(array &$array, int $flags = SORT_REGULAR): true

对 array 本身按照值(value)升序排序。

array
输入的数组。

flags
可选的第二个参数 flags 可以用以下值改变排序的行为:

排序类型标记:

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

JAVA Arrays.sort
对数组按照一定顺序排列,默认为升序

原因

因为Java是强类型语言,所以数组里面的元素要统一类型,上述Java代码表明对字符串数组进行升序排序,而PHP数组的第一个元素的类型是数字,其余是字符串,sort函数默认排序类型为SORT_REGULAR,因此两边排序的结果不一样

解决办法

PHPsort函数第二个参数传入SORT_STRING,把数组的元素当作字符串来比较

    $arr = [4367604, 'XT-6a42ab94-9124-4c44-bbc2-5f56c6fcfd99', '2321c578da9446215fcefe12adf6e2nb', '647ea7db53a88', '1686022107'];
    sort($arr, SORT_STRING);
    var_dump($arr);
array(5) {
  [0]=>
  string(10) "1686022107"
  [1]=>
  string(32) "2321c578da9446215fcefe12adf6e2nb"
  [2]=>
  int(4367604)
  [3]=>
  string(13) "647ea7db53a88"
  [4]=>
  string(39) "XT-6a42ab94-9124-4c44-bbc2-5f56c6fcfd99"
}
0