标签:
对于PHP中对数组的元素进行排序,这个是很经常用到的,之前的项目中也有,而且对于几种排序我们都是用的是asort arsort 等PHP原生函数,没有自己去实现,所以就对一下的几个函数进行总结,这个会不断的进行补充,自己也可以好好的复习和总结。
直接上代码吧!
1 <?php 2 /* 3 * 插入排序(一维数组) 4 * 每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当的位置,使数列依然有序;直到待排序的数据元素全部插入完成为止。 5 */ 6 function insertSort($arr){ 7 if(!is_array($arr) || count($arr)==0){ 8 return $arr; 9 } 10 $count = count($arr); 11 for($i=1; $i<$count; $i++){ 12 if(isset($arr[$i])){ 13 $tmp = $arr[$i]; //获取后一个元素的值 14 $j = $i - 1; //获取前面的下标 15 while($arr[$j] > $tmp){ //如果前面一个比后面一个大, 这里是从小到大 16 $arr[$j+1] = $arr[$j]; //把小的元素和前面的对换,直到移动到合适的位置,在移动下一个 17 $arr[$j] = $tmp; 18 $j--; 19 } 20 } 21 } 22 return $arr; 23 } 24 25 /* 26 * 选择排序(一维数组) 27 * 每一趟从待排序的数据元素中选出最小(最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 28 */ 29 function selectSort($arr){ 30 if(!is_array($arr) || count($arr) == 0) 31 { 32 return $arr; 33 } 34 $count = count($arr); 35 for($i=0; $i<$count; $i++){ 36 $k = $i; 37 for($j=$i+1; $j<$count; $j++){ 38 if ($arr[$k] > $arr[$j]) 39 $k = $j; //找出最小的 40 if ($k != $i){ 41 $tmp = $arr[$i]; 42 $arr[$i] = $arr[$k]; 43 $arr[$k] = $tmp; 44 } 45 } 46 } 47 return $arr; 48 } 49 50 /* 51 * 冒泡排序(一维数组) 52 * 两两比较待排序数据元素的大小,发现两个数据元素的次序相反即进行交换,直到没有反序的数据元素为止 53 */ 54 function bubbleSort($array){ 55 $count = count($array); 56 if ($count <= 0) { 57 return false; 58 } 59 for($i=0; $i<$count; $i++){ 60 for($j=$count-1; $j>$i; $j--){ 61 if ($array[$j] < $array[$j-1]){ //比较找到的数进行交换 62 $tmp = $array[$j]; 63 $array[$j] = $array[$j-1]; 64 $array[$j-1] = $tmp; 65 } 66 } 67 } 68 return $array; 69 } 70 71 /* 72 * 快速排序(一维数组) 73 * 74 */ 75 function quickSort($array){ 76 if (count($array) <= 1){ 77 return $array; 78 } 79 $key = $array[0]; 80 $left_arr = array(); 81 $right_arr = array(); 82 for ($i=1; $i<count($array); $i++){ 83 if ($array[$i] <= $key){ 84 $left_arr[] = $array[$i]; 85 }else{ 86 $right_arr[] = $array[$i]; 87 } 88 } 89 $left_arr = quickSort($left_arr); 90 $right_arr = quickSort($right_arr); 91 return array_merge($left_arr, array($key), $right_arr); 92 } 93 94 /** 95 * 按照元素的值进行排序 96 * strOrder 为排列的顺序 asc 升序 desc 降序 97 */ 98 function sortByVal($arr,$strOrder=‘asc‘) 99 { 100 if(!is_array($arr) || count($arr)==0) 101 { 102 return $arr; 103 } 104 105 $arrReturn = array(); 106 foreach($arr as $key=>$val) 107 { 108 $arrKey[] = $key; 109 $arrVal[] = $val; 110 } 111 112 $count = count($arrVal); 113 if($count) 114 { 115 //创建key的顺序数组 116 for($key=0;$key<$count;$key++) 117 { 118 $arrKeyMap[$key] = $key; 119 } 120 //对值进行排序 121 for($i=0;$i<$count;$i++) 122 { 123 124 for($j = $count-1; $j>$i;$j--) 125 { 126 //<从小到大排列 升降在这修改 127 $bol = $strOrder == ‘asc‘ ? $arrVal[$j]<$arrVal[$j-1] : $arrVal[$j]>$arrVal[$j-1]; 128 if($bol){ 129 $tmp = $arrVal[$j]; 130 $arrVal[$j] = $arrVal[$j-1]; 131 $arrVal[$j-1] = $tmp; 132 //值的冒泡排序,引起key的数组的交互 133 $keytmp = $arrKeyMap[$j]; 134 $arrKeyMap[$j] = $arrKeyMap[$j-1]; 135 $arrKeyMap[$j-1] = $keytmp; 136 } 137 } 138 } 139 if(count($arrKeyMap)) 140 { 141 foreach ($arrKeyMap as $val) 142 { 143 $arrReturn[] = $arrKey[$val]; 144 } 145 } 146 return $arrReturn; 147 } 148 } 149 150 151 /** 152 * 使用原生的函数进行数组按照值进行排列 153 */ 154 function arraySortByVal($arr,$keys,$type=‘asc‘){ 155 $keysvalue = $new_array = array(); 156 foreach ($arr as $k=>$v){ 157 $keysvalue[$k] = $v[$keys]; 158 } 159 if($type == ‘asc‘){ 160 asort($keysvalue); 161 }else{ 162 arsort($keysvalue); 163 } 164 reset($keysvalue); 165 foreach ($keysvalue as $k=>$v){ 166 $new_array[$k] = $arr[$k]; 167 } 168 return $new_array; 169 }
对于下面的2个对于array的值进行排序的方法一个是自己实现的一个是使用了原生的PHP函数的,其实排序对于少量数据一般就单页的数据量的数据还是可以的,如果涉及到大量的数据的排序,建议可以整合到MYSQL的基础类中来进行。
标签:
原文地址:http://www.cnblogs.com/vlizheng/p/5748458.html