需求:可预订排在前,不可预订排在后,即对既有数据进行重新排序,数据为二维数组,问题转换为根据二维数组的某 key 的值对二维数组进行重排
最开始使用 二维数组降为一维数组,使用 asort/arsort 进行排序,排序完成后根据一维数组的位置替换成二维数组
结果是可以重拍,但问题是对 value 值相同的数据也会打乱重排。
第二种方法使用冒泡排序,也是用二维数组降为一维数组,使用冒泡排序重拍一维,再根据一维的序号替换成二维数组
结果不可重拍,因为冒泡只替换了 value 的位置,key 的位置并没有重拍。常规的冒泡仅是解决索引数组的排序,若想用冒泡的方式,需要对关联数组进行冒泡
第三种方法使用 array_multisort() 函数
array_multisort() 函数对多个数组或多维数组进行排序。
参数中的数组被当成一个表的列并以行来进行排序 – 这类似 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话,就会按照下一个输入数组中相应值的大小进行排序,依此类推。
/**数组根据某一value值进行排序
* @param $arr 二维数组
* @param $keys 指定按哪列排序
* @param string $order_by 正序 or 倒叙
* @param bool $key 原 key 是否保留
* @param string $way 排序方法
* @return array 二维数组
*/
private function array_sort($arr,$keys,$order_by='desc',$key=FALSE,$way='bubble'){
$tmp_array = $new_array = array();
foreach($arr as $k=>$v){
$tmp_array[$k] = $v[$keys];
}
if($way == 'sort'){
//sort 方法排序,可以重拍,但是相同值的顺序会被打乱
if($order_by =='asc'){
asort($tmp_array);
}else{
arsort($tmp_array);
}
}elseif($way == 'bubble'){
//冒泡排序,不能重拍
if($order_by == 'desc') {
for ($i = 0; $i < count($tmp_array) - 1; $i++) {
for ($j = 0; $j < count($tmp_array) - $i - 1; $j++){
if ($tmp_array[$j]
$t = $tmp_array[$j];
$tmp_array[$j] = $tmp_array[$j+1];
$tmp_array[$j+1] = $t;
}
}
}
}elseif($order_by == 'asc'){
for ($i = 0; $i < count($tmp_array) - 1; $i++) {
for ($j = 0; $j < count($tmp_array) - $i - 1; $j++){
if ($tmp_array[$j]>$tmp_array[$j+1]) {
$t = $tmp_array[$j];
$tmp_array[$j] = $tmp_array[$j+1];
$tmp_array[$j+1] = $t;
}
}
}
}
}elseif($way == 'multisort'){
//multisort 方法排序,相同值的顺序按顺序输出
if($order_by == 'desc'){
array_multisort(array_column($arr,$keys),SORT_DESC,$arr);
$tmp_array = $arr;
}elseif($order_by == 'asc'){
array_multisort(array_column($arr,$keys),SORT_ASC,$arr);
$tmp_array = $arr;
}
}
reset($tmp_array);
foreach($tmp_array as $k=>$v){
if($key==TRUE){
$new_array[$k] = $arr[$k];
}else{
$new_array[] = $arr[$k];
}
}
return $new_array;
}