對於PHP中對數組的元素進行排序,這個是很經常用到的,之前的項目中也有,而且對於幾種排序我們都是用的是asort arsort 等PHP原生函數,沒有自己去實現,所以就對一下的幾個函數進行總結,這個會不斷的進行補充,自己也可以好好的復習和總結。
直接上代碼吧!
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169<?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的基礎類中來進行。