PHP数组排序函数:sort、asort和ksort的不同

做PHP开发时经常需要对数组进行排序,一维数组的排序中往往会用到三个函数:sort、asort和ksort。

大家都知道的是:sort()和asort()都是对值进行排序的,区别在于sort()排序后会去掉键,而asort()会保留键。如:

$a=array('a'=>'c','b'=>'b','c'=>'d','d'=>'a');
asort($a);
var_dump($a);

输出结果为:

array(4) { 
["d"]=> string(1) "a" 
["b"]=> string(1) "b" 
["a"]=> string(1) "c" 
["c"]=> string(1) "d" 
}

$a=array('a'=>'c','b'=>'b','c'=>'d','d'=>'a');
sort($a);
var_dump($a);

输出结果为:

array(4) { 
[0]=> string(1) "a"
[1]=> string(1) "b"
[2]=> string(1) "c"
[3]=> string(1) "d"
}

而ksort()与上面的不同在于这个函数是用键来排序的。

$a=array('c'=>'a','b'=>'d','d'=>'c','a'=>'b');
ksort($a);
var_dump($a);

输出结果为:

array(4) { 
["a"]=> string(1) "b"
["b"]=> string(1) "d"
["c"]=> string(1) "a"
["d"]=> string(1) "c" }

 

不过,ksort()和前两种排序还有一个不同可能被人忽略:

当进行数字和字符混排的时候:

$a=array('1'=>'1','2'=>'2','d'=>'d','a'=>'a');
ksort($a);
var_dump($a);
asort($a);
var_dump($a);

输出结果:

array(4) { 
["a"]=> string(1) "a" 
["d"]=> string(1) "d" 
[1]=> string(1) "1" 
[2]=> string(1) "2" 
} 
array(4) { 
[1]=> string(1) "1" 
[2]=> string(1) "2" 
["a"]=> string(1) "a" 
["d"]=> string(1) "d" 
}

排序结果不一样了。似乎ksort认为字母应该排在数字前面,而asort认为字母应该排在数字后面。阅读php文档会发现,这三个函数都有第二个参数:sorttype

参数描述
array 必需。输入的数组。
sorttype

可选。规定如何排列数组的值。可能的值:

  • SORT_REGULAR - 默认。以它们原来的类型进行处理(不改变类型)。
  • SORT_NUMERIC - 把值作为数字来处理
  • SORT_STRING - 把值作为字符串来处理
  • SORT_LOCALE_STRING - 把值作为字符串来处理,基于本地设置*

 

一般我们不会传入第二个参数的,但是这种数字和字母混排的情况就有必要考虑了。对于asort,我们是按值排序的,例子中四个元素都是string类型的,于是SORT_REGULAR - 默认会按SORT_STRING - 把值作为字符串来处理。而对于ksort,虽然我们的键都是字符串,但php会自动把字符串型的数字键转换为int型,因此排序的时候SORT_REGULAR - 默认会按SORT_NUMERIC - 把值作为数字来处理。排序方式不一样当然结果不一样了。我们可以验证一下:

$a=array('a'=>'a','b'=>'b','1'=>1,'2'=>2);
ksort($a);
var_dump($a);
asort($a);
var_dump($a);

输出结果:

array(4) { 
["a"]=> string(1) "a"
["b"]=> string(1) "b"
[1]=> int(1)
[2]=> int(2)
}
array(4) {
["a"]=> string(1) "a"
["b"]=> string(1) "b"
[1]=> int(1)
[2]=> int(2)
}

这样世界就和平了~

在使用这几个函数时,必要的时候还是要传入第二个参数的呀。不过还是希望以后不会再遇到需要将字母和数字一起排序这样的反人类的情况——没人知道到底哪个该放在前面~

posted @ 2017-10-09 16:10  袁浩浩  阅读(535)  评论(0编辑  收藏  举报