在开发中很容易遇到一些数据的排序问题,今日在开发银行项目优惠券中,因为接口数据库对数据的排序规则不准确,
因此需要对数据进一层次的处理,这就使用到了排序,
排序规则:先按 优惠券类型 未使用、已使用 、已过期
按 优惠券金额 从大到小 倒序
按 优惠券到期时间 升序
就是这三条规则,平时我们的排序方式只会排列一种类型,但这无法满足我们需求,
因此需要找到这个方法:
array_multisort()
SORT_REGULAR - 将项目按照通常方法比较(不修改类型)
SORT_NUMERIC - 按照数字大小比较
SORT_STRING - 按照字符串比较
SORT_LOCALE_STRING - 根据当前的本地化设置,按照字符串比较。 它会使用 locale 信息,可以通过 setlocale() 修改此信息。
SORT_NATURAL - 以字符串的"自然排序",类似 natsort()
SORT_FLAG_CASE - 可以组合 (按位或 OR) SORT_STRING 或者 SORT_NATURAL 大小写不敏感的方式排序字符串。
还有其他的排序方法,那么我们看看
以下三种方式都是用户自定义排序
uasort 按值进行排序 保持索引
usort 按值进行排序,不保持索引
uksort 按key进行排序,这里没有说到什么 保持索引,因为 key本身就是索引了。
sort() 函数用于对数组单元从低到高进行排序。
rsort() 函数用于对数组单元从高到低进行排序。
asort() 函数用于对数组单元从低到高进行排序并保持索引关系。
arsort() 函数用于对数组单元从高到低进行排序并保持索引关系。
ksort() 函数用于对数组单元按照键名从低到高进行排序。
krsort() 函数用于对数组单元按照键名从高到低进行排序。
就是这么几种。
//进行数组多列排序
function arrayOrderby() {
$args = func_get_args();
$data = array_shift($args);
if(!$data) return [];
foreach ($args as $n => $field) {
if (is_string($field)) {
$tmp = array();
foreach ($data as $key => $row) {
$tmp[$key] = $row[$field];
}
$args[$n] = $tmp;
}
}
$args[] = &$data;
call_user_func_array('array_multisort', $args);
return array_pop($args);
}
/**
加入了容错处理
*/
function arrayOrderby(){
$args=func_get_args();
$data=array_shift($args);
foreach($args as $key=>$filed){
if(is_string($filed)){
$tmp=[];
foreach($data as $k=>$v){
if(!isset($v[$filed])){
unset($args[$key]);
if(isset($args[$key+1]))
unset($args[($key+1)]);
continue;
}
$tmp[$k]=$v[$filed];
}
empty($tmp) || $args[$key]=$tmp;
}
}
$args[]=&$data;
call_user_func_array('array_multisort',$args);
return array_pop($args);
//print_r($args);
}
$data = [
['Name' => 'Brown', 'Animal' => 'Yiwu'],
['Name' => 'Brown', 'Animal' => 'Dog'],
['Name' => 'Smith', 'Animal' => 'Cat'],
['Name' => 'Jones', 'Animal' => 'Dog'],
['Name' => 'Jones', 'Animal' => 'Pig'],
['Name' => 'Bennett', 'Animal' => 'Cat'],
['Name' => 'Astor', 'Animal' => 'Cat'],
['Name' => 'Jones', 'Animal' => 'Cat'],
];
$data = arrayOrderby($data, 'Name', SORT_ASC, 'Animal', SORT_DESC);
print_r($data);
/**
*
结果如下:
Array
(
[0] => Array
(
[Name] => Astor
[Animal] => Cat
)
[1] => Array
(
[Name] => Bennett
[Animal] => Cat
)
[2] => Array
(
[Name] => Brown
[Animal] => Yiwu
)
[3] => Array
(
[Name] => Brown
[Animal] => Dog
)
[4] => Array
(
[Name] => Jones
[Animal] => Pig
)
[5] => Array
(
[Name] => Jones
[Animal] => Dog
)
[6] => Array
(
[Name] => Jones
[Animal] => Cat
)
[7] => Array
(
[Name] => Smith
[Animal] => Cat
)
)
*/
$arr = array(
'0' => array(
'id' => 3,
'age' => 27,
),
'1' => array(
'id' => 5,
'age' => 50,
),
'2' => array(
'id' => 4,
'age' => 44,
),
'3' => array(
'id' => 3,
'age' => 78,
),
);
$result2 = arrayOrderby($arr, 'id', SORT_ASC, 'age', SORT_DESC);
print_r($result2);
/**
结果如下:
Array
(
[0] => Array
(
[id] => 3
[age] => 78
)
[1] => Array
(
[id] => 3
[age] => 27
)
[2] => Array
(
[id] => 4
[age] => 44
)
[3] => Array
(
[id] => 5
[age] => 50
)
)
*/还可以使用这种方法进行排序
$couponlistResult = arrayOrderby($result['couponlist'],'typesort',SORT_NUMERIC,SORT_ASC,'7',SORT_DESC,'4',SORT_STRING,SORT_ASC); //这里面是可以写索引值的