需求:可预订排在前,不可预订排在后,即对既有数据进行重新排序,数据为二维数组,问题转换为根据二维数组的某 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]<$tmp_array[$j+1]) { $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; }