/**
* 二维数组按某个字段排序
* @param $arr
* @param $field
* @param int $type SORT_ASC从小到大 SORT_DESC从大到小
* 另外常用的几个排序函数为 sort rsort asort arsort
*/
function field_sort(&$arr,$field,$type=SORT_DESC){
$columns = array_column($arr,$field);
array_multisort($columns,$type,$arr);//根据金额大小降序排列
}
/*
* 普通排序
* $array为要排序的数组
* $keys为要用来排序的键名
* $type默认为升序排序
*/
function array_sort($array, $keys, $type = 'asc')
{
$keysvalue = $new_array = array();
foreach ($array as $k => $v) {
$keysvalue[$k] = $v[$keys];
}
if ($type == 'asc') {
asort($keysvalue);
} else {
arsort($keysvalue);
}
reset($keysvalue);
foreach ($keysvalue as $k => $v) {
$new_array[$k] = $array[$k];
}
return $new_array;
}
/**
* 冒泡排序
* @param $arr
* @param string $type ASC从小到大 DESC从大到小
* @return mixed
*/
function sorts($arr,$type='ASC'){
$len = count($arr);
for($i=0; $i < $len-1; $i++){
for($j=0; $j < $len-$i-1; $j++){
if($type=='ASC'){
if($arr[$j] > $arr[$j+1]){
swap($arr,$j);
}
}else{
if($arr[$j] < $arr[$j+1]){
swap($arr,$j);
}
}
}
}
return $arr;
}
/**
* 快速排序
* @param $arr
* @param string $type ASC从小到大 DESC从大到小
* @return array
*/
function quick_sort($arr, $type='ASC'){
$len = count($arr);
if($len <=1){
return $arr;
}
$left = $right = [];
$mid_index = $len>>1;
$mid_value = $arr[$mid_index];
for($i=0; $i < $len; $i++){
if($i == $mid_index){
continue;
}
if($type == 'ASC'){
if($arr[$i] < $mid_value){
$left[] = $arr[$i];
}else{
$right[] = $arr[$i];
}
}else{
if($arr[$i] > $mid_value){
$left[] = $arr[$i];
}else{
$right[] = $arr[$i];
}
}
}
return array_merge(quick_sort($left,$type),[$mid_value],quick_sort($right,$type));
}
/**
* 交换两个值
* @param $arr
* @param $k
*/
function swap(&$arr,$k){
$temp = $arr[$k+1];
$arr[$k+1] = $arr[$k];
$arr[$k] = $temp;
}
/**
* 归并排序
* @param $arr
* @return array
*/
function merge_sort($arr){
$len = count($arr);
if($len<=1){
return $arr;
}
$half = ($len>>1)+($len & 1);
$arr2d = array_chunk($arr,$half);
$left = merge_sort($arr2d[0]);
$right = merge_sort($arr2d[1]);
while(count($left) && count($right)){
if($left[0] < $right[0]){
$reg[] = array_shift($left);
}else{
$reg[] = array_shift($right);
}
}
return array_merge($reg,$left,$right);
}
网友评论