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的基礎類中來進行。
*