在对我的字符串数组进行排序时,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;
答案 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;
});