作为程序员一定要保持良好的睡眠,才能好编程

array_multisort 经典排序及其他排序方法

发布时间:2018-08-24

在开发中很容易遇到一些数据的排序问题,今日在开发银行项目优惠券中,因为接口数据库对数据的排序规则不准确,

因此需要对数据进一层次的处理,这就使用到了排序,


排序规则:先按  优惠券类型   未使用、已使用 、已过期

                 按 优惠券金额  从大到小 倒序

                 按 优惠券到期时间  升序


就是这三条规则,平时我们的排序方式只会排列一种类型,但这无法满足我们需求,


因此需要找到这个方法:


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);


//这里面是可以写索引值的



array_sort.txt