字母排序将较短的字符串放在错误的较长字符串之后

时间:2019-03-26 15:21:05

标签: php usort

在对我的字符串数组进行排序时,usort将较短的字符串放在较长的字符串之前,这与其他排序方法(特别是在我的应用程序客户端的排序方法)不同。例如。 “ test”将在“ test1”之前。我该如何修改排序,使较短的字符串出现在较长的字符串之后

我设计了一种方法,可以找到较短的字符串,但我似乎无法更改排序的位置

   usort($nc, function ($item1, $item2) use($sortcol){
                        $string1 = trim(strtolower($item1[$sortcol]));
                        $string2 = trim(strtolower($item2[$sortcol]));
                        if (strpos($string1, $string2) === 0 ) {

                                return 1;
                            }
                        if (strpos($string2, $string1) === 0 ) {

                                return -1;
                            }

                        return $string1 < $string2;

1 个答案:

答案 0 :(得分:0)

您的回调函数没有意义。

首先,请理解,当您使用比较运算符(>,<和=)比较字符串时,PHP会将这些字符串中的字符转换为其序数值,然后进行数字比较,而不是按字典顺序进行比较。 “ b” <“ t”的原因是因为PHP实际上正在比较整数。这会产生您不一定会期望的结果:

php > $one = "a"; $two = "b";
php > var_dump(strcmp($one, $two));
int(-1)
php > $one = "b"; $two = "a";
php > var_dump(strcmp($one, $two));
int(1)
php > $one = "b"; $two = "b";
php > var_dump(strcmp($one, $two));
int(0)
php > $one = "a"; $two = "z";
php > var_dump(strcmp($one, $two));
int(-25)
php > $one = "z"; $two = "a";
php > var_dump(strcmp($one, $two));
int(25)
php > $one = "aa"; $two = "z";
php > var_dump(strcmp($one, $two));
int(-25)
php > $one = "zz"; $two = "a";
php > var_dump(strcmp($one, $two));
int(25)

使用比较运算符判断字符串也遵循相同的行为,因此,考虑到回调函数中的内容,预期为100%。我不确定为什么要检查一个是否是另一个的子字符串。如果要先检查长度,请检查它们,但要了解,您正在颠倒现有的PHP短字符串约定,然后再改为长。我们的前两个返回值反映了这一变化。

$result = usort($nc, function ($item1, $item2) use($sortcol){
    $string1 = trim(strtolower($item1[$sortcol]));
    $string2 = trim(strtolower($item2[$sortcol]));
    if (strlen($string1) > strlen($string2) ) {return -1;}
    if (strlen($string1) < strlen($string2) ) {return 1;}
    return $string1 < $string2;
});