PHP中二維數組的排序方法
/**
* @package???? BugFree
* @version???? $Id: FunctionsMain.inc.php,v 1.32 2005/09/24 11:38:37 wwccss Exp $
*
*
* Sort an two-dimension array by some level two items use array_multisort() function.
*
* sysSortArray($Array,"Key1","SORT_ASC","SORT_RETULAR","Key2"……)
* @author????????????????????? Chunsheng Wang <[email protected]>
* @param? array?? $ArrayData?? the array to sort.
* @param? string? $KeyName1??? the first item to sort by.
* @param? string? $SortOrder1? the order to sort by("SORT_ASC"|"SORT_DESC")
* @param? string? $SortType1?? the sort type("SORT_REGULAR"|"SORT_NUMERIC"|"SORT_STRING")
* @return array??????????????? sorted array.
*/
function sysSortArray($ArrayData,$KeyName1,$SortOrder1 = "SORT_ASC",$SortType1 = "SORT_REGULAR")
{
??? if(!is_array($ArrayData))
??? {
??????? return $ArrayData;
??? }
?
??? // Get args number.
??? $ArgCount = func_num_args();
?
??? // Get keys to sort by and put them to SortRule array.
??? for($I = 1;$I < $ArgCount;$I ++)
??? {
??????? $Arg = func_get_arg($I);
??????? if(!eregi("SORT",$Arg))
??????? {
??????????? $KeyNameList[] = $Arg;
??????????? $SortRule[]??? = '$'.$Arg;
??????? }
??????? else
??????? {
??????????? $SortRule[]??? = $Arg;
??????? }
??? }
?
??? // Get the values according to the keys and put them to array.
??? foreach($ArrayData AS $Key => $Info)
??? {
??????? foreach($KeyNameList AS $KeyName)
??????? {
??????????? ${$KeyName}[$Key] = $Info[$KeyName];
??????? }
??? }
?
??? // Create the eval string and eval it.
??? $EvalString = 'array_multisort('.join(",",$SortRule).',$ArrayData);';
??? eval ($EvalString);
??? return $ArrayData;
}
?
?
//################# 樣本 #################
$arr = array(
??? array(
??????? 'name'??????? =>??? '學習',
??????? 'size'??????? =>??? '1235',
??????? 'type'??????? =>??? 'jpe',
??????? 'time'??????? =>??? '1921-11-13',
??????? 'class'??????? =>??? 'dd',
??? ),
??? array(
??????? 'name'??????? =>??? '中國功夫',
??????? 'size'??????? =>??? '153',
??????? 'type'??????? =>??? 'jpe',
??????? 'time'??????? =>??? '2005-11-13',
??????? 'class'??????? =>??? 'jj',
??? ),
??? array(
??????? 'name'??????? =>??? '編程',
??????? 'size'??????? =>??? '35',
??????? 'type'??????? =>??? 'gif',
??????? 'time'??????? =>??? '1997-11-13',
??????? 'class'??????? =>??? 'dd',
??? ),
??? array(
??????? 'name'??????? =>??? '中國功夫',
??????? 'size'??????? =>??? '65',
??????? 'type'??????? =>??? 'jpe',
??????? 'time'??????? =>??? '1925-02-13',
??????? 'class'??????? =>??? 'yy',
??? ),
??? array(
??????? 'name'??????? =>??? '中國功夫',
??????? 'size'??????? =>??? '5',
??????? 'type'??????? =>??? 'icon',
??????? 'time'??????? =>??? '1967-12-13',
??????? 'class'??????? =>??? 'rr',
??? ),
);
?
print_r($arr);
?
//注意:按照數字方式排序時 153 比 65 小
$temp = sysSortArray($arr,"name","SORT_ASC","type","SORT_DESC","size","SORT_ASC","SORT_STRING");
?
print_r($temp);
?
?>
?
其他相關排序函數:
?
sort ( array &$array [, int $sort_flags] )
該函數會對目標數組進行排序,各元素按值由低到高的順序排列.注意,該函數參數是按引用傳遞的, 它並不是返回排序後的數組.相反,它只是對當前數組排序,不論結果如何都不返回任何值.
注意: 本函數為 array 中的單元賦予新的鍵名.這將刪除原有的鍵名而不僅是重新排序.
$arr = array(9,5,2,6,8,4,3,1); sort($arr); print_r($arr); ?>
輸出:(可以看到索引值關聯不再保持)
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 8 [7] => 9 )
asort ( array &$array [, int $sort_flags] )
本函數對數組進行排序,數組的索引保持和單元的關聯.主要用於對那些單元順序很重要的結合數組進行排序.?同樣是按引用傳遞的,沒傳回值.
輸出(可以看到索引值保持不變):
Array ( [5] => 1 [1] => 2 [4] => 4 [0] => 5 [2] => 6 [3] => 8 )
rsort ( array &$array [, int $sort_flags] )
本函數類似sort函數, 對數組進行逆向排序(最高到最低)。
注:?本函數為?array?中的單元賦予新的鍵名。這將刪除原有的鍵名而不僅是重新排序。
如果成功則返回?TRUE,失敗則返回?FALSE。
arsort ( array &$array [, int $sort_flags] )
本函數對數組進行逆向排序,數組的索引保持和單元的關聯。主要用於對那些單元順序很重要的結合數組進行排序。arsort()函數與asort()相同,只是它以相反的順序(降序)對數組元素排序。
如果成功則返回?TRUE,失敗則返回?FALSE。
ksort ( array &$array [, int $sort_flags] )
ksort和sort的區別就是對數組按照鍵名排序而不是按值排序,保留鍵名到資料的關聯.本函數主要用於關聯陣列. 如果成功則返回 TRUE,失敗則返回 FALSE。
krsort ( array &$array [, int $sort_flags] )
見ksort,該函數同ksort只是把ksort後的結果逆序排序而已。
natsort ( array &$array )
本函數實現了一個和人們通常對字母數字字串進行排序的方法一樣的排序演算法並保持原有鍵/值的關聯,這被稱為“自然排序”.本演算法和通常的電腦字串排序演算法(用於 sort())的區別見下面樣本.
如果成功則返回 TRUE,失敗則返回 FALSE.
php手冊中有個非常經典的例子
上例將輸出:Standard sorting
Array ( [0] => img1.png [1] => img10.png [2] => img12.png [3] => img2.png )
Natural order sorting
Array ( [3] => img1.png [2] => img2.png [1] => img10.png [0] => img12.png )
還有些數組排序函數以u(user)開頭的, 都是些使用者自訂排序函數。時間原因這就不多寫了。