PHP中對數組的元素進行排序,這個是很經常用到的,之前的項目中也有,而且對於幾種排序我們都是用的是asort arsort 等PHP原生函數,沒有自己去實現,所以就對一下的幾個函數進行總結,這個會不斷的進行補充,自己也可以好好的復習和總結。
/* * 插入排序(一維數組) * 每次將一個待排序的數據元素,插入到前面已經排好序的數列中的適當的位置,使數列依然有序;直到待排序的數據元素全部插入完成為止。 */ function insertSort($arr){ if(!is_array($arr) ||count($arr)==0){ return $arr; } $count =count($arr); for($i=1;$i<$count;$i++){ if(isset($arr[$i])){ $tmp =$arr[$i];//獲取後一個元素的值 $j =$i - 1;//獲取前面的下標 while($arr[$j] >$tmp){//如果前面一個比後面一個大, 這裡是從小到大 $arr[$j+1] =$arr[$j];//把小的元素和前面的對換,直到移動到合適的位置,在移動下一個 $arr[$j] =$tmp; $j--; } } } return $arr; } /* * 選擇排序(一維數組) * 每一趟從待排序的數據元素中選出最小(最大)的一個元素,順序放在已排好序的數列的最後,直到全部待排序的數據元素排完。 */ function selectSort($arr){ if(!is_array($arr) ||count($arr) == 0) { return $arr; } $count =count($arr); for($i=0;$i<$count;$i++){ $k =$i; for($j=$i+1;$j<$count;$j++){ if ($arr[$k] >$arr[$j]) $k =$j;//找出最小的 if ($k !=$i){ $tmp =$arr[$i]; $arr[$i] =$arr[$k]; $arr[$k] =$tmp; } } } return $arr; } /* * 冒泡排序(一維數組) * 兩兩比較待排序數據元素的大小,發現兩個數據元素的次序相反即進行交換,直到沒有反序的數據元素為止 */ function bubbleSort($array){ $count =count($array); if ($count <= 0) { return false; } for($i=0;$i<$count;$i++){ for($j=$count-1;$j>$i;$j--){ if ($array[$j] <$array[$j-1]){//比較找到的數進行交換 $tmp =$array[$j]; $array[$j] =$array[$j-1]; $array[$j-1] =$tmp; } } } return $array; } /* * 快速排序(一維數組) * */ function quickSort($array){ if (count($array) <= 1){ return $array; } $key =$array[0]; $left_arr =array(); $right_arr =array(); for ($i=1;$i<count($array);$i++){ if ($array[$i] <=$key){ $left_arr[] =$array[$i]; }else{ $right_arr[] =$array[$i]; } } $left_arr = quickSort($left_arr); $right_arr = quickSort($right_arr); return array_merge($left_arr,array($key),$right_arr); } /** * 按照元素的值進行排序 * strOrder 為排列的順序 asc 升序 desc 降序 */ function sortByVal($arr,$strOrder='asc') { if(!is_array($arr) ||count($arr)==0) { return $arr; } $arrReturn =array(); foreach($arr as $key=>$val) { $arrKey[] =$key; $arrVal[] =$val; } $count =count($arrVal); if($count) { //創建key的順序數組 for($key=0;$key<$count;$key++) { $arrKeyMap[$key] =$key; } //對值進行排序 for($i=0;$i<$count;$i++) { for($j =$count-1;$j>$i;$j--) { //<從小到大排列 升降在這修改 $bol =$strOrder =='asc' ?$arrVal[$j]<$arrVal[$j-1] :$arrVal[$j]>$arrVal[$j-1]; if($bol){ $tmp =$arrVal[$j]; $arrVal[$j] =$arrVal[$j-1]; $arrVal[$j-1] =$tmp; //值的冒泡排序,引起key的數組的交互 $keytmp =$arrKeyMap[$j]; $arrKeyMap[$j] =$arrKeyMap[$j-1]; $arrKeyMap[$j-1] =$keytmp; } } } if(count($arrKeyMap)) { foreach ($arrKeyMap as $val) { $arrReturn[] =$arrKey[$val]; } } return $arrReturn; } } /** * 使用原生的函數進行數組按照值進行排列 */ function arraySortByVal($arr,$keys,$type='asc'){ $keysvalue =$new_array =array(); foreach ($arr 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] =$arr[$k]; } return $new_array;
對於下面的2個對於array的值進行排序的方法一個是自己實現的一個是使用了原生的PHP函數的,其實排序對於少量數據一般就單頁的數據量的數據還是可以的,如果涉及到大量的數據的排序,建議可以整合到MYSQL的基礎類中來進行。
*