php中有很多排序函数,下面是常用的一些:
- sort() 函数用于对数组单元从低到高进行排序。
- rsort() 函数用于对数组单元从高到低进行排序。
- asort() 函数用于对数组单元从低到高进行排序并保持索引关系。
- arsort() 函数用于对数组单元从高到低进行排序并保持索引关系。
- usort() 使用用户自定义的比较函数对数组中的值进行排序
- uasort() 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联
sort()用法很简单,就不多说了。
接下来我们看一个案例:
有如下一个数组
[php] view plain copy
- $sorted_array = array(array('ts'=>3,'gold'=>4),
- array('ts'=>8,'gold'=>10),
- array('ts'=>5,'gold'=>7),
- array('ts'=>1,'gold'=>20),
- array('ts'=>9,'gold'=>7),
- array('ts'=>3,'gold'=>7)
- );
[php] view plain copy
- print_r(sort_via_key($sorted_array, 'ts'));
- function sort_via_key($data, $key)
- {
- if(empty($data)) return array();
- $ret = array();
- $sorted_arr = array();
- foreach ($data as $i => $_item)
- {
- $sorted_arr[$i] = $_item[$key];
- }
- arsort($sorted_arr);
- foreach ($sorted_arr as $i => $_item)
- {
- $ret[] = $data[$i];
- }
- return $ret;
- }
[php] view plain copy
- Array
- (
- [0] => Array
- (
- [ts] => 9
- [gold] => 7
- )
- [1] => Array
- (
- [ts] => 8
- [gold] => 10
- )
- [2] => Array
- (
- [ts] => 5
- [gold] => 7
- )
- [3] => Array
- (
- [ts] => 3
- [gold] => 7
- )
- [4] => Array
- (
- [ts] => 3
- [gold] => 4
- )
- [5] => Array
- (
- [ts] => 1
- [gold] => 20
- )
- )
[php] view plain copy
- sort_via_key($sorted_array, 'gold')
[php] view plain copy
- Array
- (
- [0] => Array
- (
- [ts] => 1
- [gold] => 20
- )
- [1] => Array
- (
- [ts] => 8
- [gold] => 10
- )
- [2] => Array
- (
- [ts] => 9
- [gold] => 7
- )
- [3] => Array
- (
- [ts] => 3
- [gold] => 7
- )
- [4] => Array
- (
- [ts] => 5
- [gold] => 7
- )
- [5] => Array
- (
- [ts] => 3
- [gold] => 4
- )
- )
我们只需提供如下比较函数就能完成第一个需求:
[php] view plain copy
- usort($sorted_array, "cmp_ts_desc");
- function cmp_ts_desc($a, $b)
- {
- if ($a['ts'] == $b['ts']) {
- return 0;
- }
- return ($a['ts'] < $b['ts']) ? 1 : -1; //倒序的话a<b返回大于0,正序a<b返回小于0
- }
[php] view plain copy
- function multi_compare($a, $b)
- {
- $criteria = array(
- 'gold'=>'desc',
- 'ts'=>'desc' //这里还可以根据需要继续加条件 如:'x'=>'asc'等
- );
- foreach($criteria as $what => $order){
- if($a[$what] == $b[$what]){
- continue;
- }
- return (($order == 'desc')?-1:1) * (($a[$what] < $b[$what]) ? -1 : 1);
- }
- return 0;
- }
[php] view plain copy
- usort($sorted_array, "multi_compare");
[php] view plain copy
- Array
- (
- [0] => Array
- (
- [ts] => 1
- [gold] => 20
- )
- [1] => Array
- (
- [ts] => 8
- [gold] => 10
- )
- [2] => Array
- (
- [ts] => 9
- [gold] => 7
- )
- [3] => Array
- (
- [ts] => 5
- [gold] => 7
- )
- [4] => Array
- (
- [ts] => 3
- [gold] => 7
- )
- [5] => Array
- (
- [ts] => 3
- [gold] => 4
- )
- )
评论 (0)