PHP自带的排序函数如下:
- sort() 函数用于对数组单元从低到高进行排序。
- rsort() 函数用于对数组单元从高到低进行排序。
- asort() 函数用于对数组单元从低到高进行排序并保持索引关系。
- arsort() 函数用于对数组单元从高到低进行排序并保持索引关系。
- usort() 使用用户自定义的比较函数对数组中的值进行排序
- uasort() 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联
自定义排序函数扩展
以上函数只能对数组进行简单对排序,无法满足日常开发中比较复杂的排序需求,幸好PHP支持自定义排序规则的函数,例如usort,uasort等
接下来我们结合一个实际的需求进行说明:
实际需求要求对一个二维数组针对指定对字段进行排序
$list = array(
array(
"avtiveId" => 100049,
"ct" => 110,
"showName" => "questionName1",
"showOrder" => 5
),
array(
"avtiveId" => 100049,
"ct" => 98,
"showName" => "questionName2",
"showOrder" => 4
),
array(
"avtiveId" => 100050,
"ct" => 98,
"showName" => "questionName3",
"showOrder" => 4
),
array(
"avtiveId" => 100049,
"ct" => 108,
"showName" => "questionName4",
"showOrder" => 4
),
array(
"avtiveId" => 100049,
"ct" => 89,
"showName" => "questionName5",
"showOrder" => 3
)
);
要求对如上数组中对showOrder进行降序排列,先用最原始的方法
print_r(sort_via_key($list, 'showOrder'));
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;
}
是不是比较啰嗦?代码应该尽量简单,那么就换一种方式来实现
usort($sorted_array, function ($a, $b) {
if ($a['showOrder'] == $b['showOrder']) {
return 0;
}
return ($a['showOrder'] < $b['showOrder']) ? 1 : -1; //倒序的话a<b返回大于0,正序a<b返回小于0
});
以上实现应用了PHP的usort函数,自定义了一个排序的闭包函数,如果要保留原有数组的key,那么可以用uasort函数
那么现在,需求有了新的变化,如果showOrder的值相等的情况下,需要按照ct进行降序排列,怎么办呢? 我们加工一下上边的usort排序闭包的实现:
usort($list, function ($a, $b) {
$criteria = array(
'showOrder'=>'desc',
'ct'=>'desc',
'avtiveId' => '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;
});
var_dump($list);
输出结果如下
tianjiaweideMacBook-Pro:sites tianjiawei$ php test.php
array(5) {
[0]=>
array(4) {
["avtiveId"]=>
int(100049)
["ct"]=>
int(110)
["showName"]=>
string(19) "一答软广配置1"
["showOrder"]=>
int(5)
}
[1]=>
array(4) {
["avtiveId"]=>
int(100049)
["ct"]=>
int(108)
["showName"]=>
string(19) "一答软广配置4"
["showOrder"]=>
int(4)
}
[2]=>
array(4) {
["avtiveId"]=>
int(100049)
["ct"]=>
int(98)
["showName"]=>
string(19) "一答软广配置2"
["showOrder"]=>
int(4)
}
[3]=>
array(4) {
["avtiveId"]=>
int(100050)
["ct"]=>
int(98)
["showName"]=>
string(19) "一答软广配置3"
["showOrder"]=>
int(4)
}
[4]=>
array(4) {
["avtiveId"]=>
int(100049)
["ct"]=>
string(19) "2017-07-19 12:25:05"
["showName"]=>
string(19) "一答软广配置5"
["showOrder"]=>
int(3)
}
}
这个函数的关键在于对$criteria规则的定义,按照指定的规则一步一步往下进行比较,只需要定义$criteria的排序规则即可