>>更多精彩文章,請詳見 http://www.web-lovers.com/php
實際開發中,多多少少都會遇到數組的排序問題,除了常規的寫簡單的排序算法,PHP 還提供了內置數組排序函數,本次重點分享一下:uasort 使用用戶自定義的比較函數對數組中的值進行排序並保持索引關聯,可排序多維數組,本文重點講解此函數。 web
uasort 函數算法
參數類型:bool uasort ( array &$array, callable $cmp_function)數組
本函數對數組排序並保持索引和單元之間的關聯。函數
主要用於對那些單元順序很重要的結合數組進行排序。比較函數是用戶自定義的。this
成功時返回 TRUE
, 或者在失敗時返回 FALSE
。spa
數組排序實例(非class中):.net
1 /** 2 * 自定義排序函數 3 * @param $param1 4 * @param $param2 5 * @return 0(不移動) 1(正向調換順序) -1(逆向調換順序) 6 */ 7 8 function my_sort($param1, $param2){ 9 if($param1 == $param2) return 0; 10 else return $param1 > $param2 ? 1 : -1; 11 } 12 13 $arr = array( 14 'a'=>'20', 15 'b'=>'1', 16 'c'=>'10', 17 'd'=>'5', 18 'e'=>'21', 19 'f'=>'4', 20 'g'=>'3', 21 ); 22 23 uasort($arr, 'my_sort'); 24 25 var_dump($arr); 26 27 /*輸出值 28 array (size=7) 29 'b' => string '1' (length=1) 30 'g' => string '3' (length=1) 31 'f' => string '4' (length=1) 32 'd' => string '5' (length=1) 33 'c' => string '10' (length=2) 34 'a' => string '20' (length=2) 35 'e' => string '21' (length=2) 36 */
多維數組排序實例(非class中):code
/** * 自定義排序函數 * @param $param1 * @param $param2 * @return 0(不移動) 1(正向調換順序) -1(逆向調換順序) */ function my_sort($param1, $param2){ if($param1['value'] == $param2['value']) return 0; else return $param1['value'] > $param2['value'] ? 1 : -1; } $arr = array( 'a'=>array('key'=>'定義1', 'value'=>'20'), 'b'=>array('key'=>'定義2', 'value'=>'1'), 'c'=>array('key'=>'定義3', 'value'=>'10'), 'd'=>array('key'=>'定義4', 'value'=>'5'), 'e'=>array('key'=>'定義5', 'value'=>'21'), 'f'=>array('key'=>'定義6', 'value'=>'4'), 'g'=>array('key'=>'定義7', 'value'=>'3'), ); uasort($arr, 'my_sort'); var_dump($arr); /*輸出值 array (size=7) 'b' => array (size=2) 'key' => string '定義2' (length=7) 'value' => string '1' (length=1) 'g' => array (size=2) 'key' => string '定義7' (length=7) 'value' => string '3' (length=1) 'f' => array (size=2) 'key' => string '定義6' (length=7) 'value' => string '4' (length=1) 'd' => array (size=2) 'key' => string '定義4' (length=7) 'value' => string '5' (length=1) 'c' => array (size=2) 'key' => string '定義3' (length=7) 'value' => string '10' (length=2) 'a' => array (size=2) 'key' => string '定義1' (length=7) 'value' => string '20' (length=2) 'e' => array (size=2) 'key' => string '定義5' (length=7) 'value' => string '21' (length=2) */
class中排序,爲了方便以二維數組爲例:blog
uasort($arr1, array($this, 'public_my_sort'));
uasort($arr2, array('self', 'self_my_sort'));
class myClassSort{ /** * 排序主方法 * @param $arr1 self靜態排序 * @param $arr2 this排序 * @return 排序後的數組 */ public function main($arr1 = array(), $arr2 = array()){ uasort($arr1, array($this, 'public_my_sort')); uasort($arr2, array('self', 'self_my_sort')); return array('arr1'=>$arr1, 'arr2'=>$arr2); } /** * 自定義排序函數 * @param $param1 * @param $param2 * @return 0(不移動) 1(正向調換順序) -1(逆向調換順序) */ private static function self_my_sort($param1, $param2){ if($param1['value'] == $param2['value']) return 0; else return $param1['value'] > $param2['value'] ? 1 : -1; } //同上 public function public_my_sort($param1, $param2){ if($param1['value'] == $param2['value']) return 0; else return $param1['value'] > $param2['value'] ? 1 : -1; } } $arr = array( 'a'=>array('key'=>'定義1', 'value'=>'20'), 'b'=>array('key'=>'定義2', 'value'=>'1'), 'c'=>array('key'=>'定義3', 'value'=>'10'), 'd'=>array('key'=>'定義4', 'value'=>'5'), 'e'=>array('key'=>'定義5', 'value'=>'21'), 'f'=>array('key'=>'定義6', 'value'=>'4'), 'g'=>array('key'=>'定義7', 'value'=>'3'), ); $myClassSort = new myClassSort(); var_dump($myClassSort->main($arr, $arr)); /*輸出結果同以上實例*/
相似函數擴展
array_multisort 對多個數組或多維數組進行排序,可是最終填入使用的仍是具體一維數組
arsort 對一維數組進行逆向排序並保持索引關係,保持索引對應關係
asort 對一維數組進行正向排序並保持索引關係,保持索引對應關係
krsort 對數組按照鍵名逆向排序,保持索引對應關係
ksort 對數組按照鍵名正向排序,保持索引對應關係
natcasesort 用「天然排序」算法對一維數組進行不區分大小寫字母的排序,能夠用來排序數組內容中字母數字混合的狀況,保持索引對應關係
natsort 用「天然排序」算法對一維數組排序,區分大小寫字母,能夠用來排序數組內容中字母數字混合的狀況,保持索引對應關係
rsort 對一維數組逆向排序,不保持索引對應關係
sort 對一維數組正向排序,不保持索引對應關係
uasort 使用用戶自定義的比較函數對數組中的值進行排序並保持索引關聯,可排序多維數組,本文重點講解此函數
uksort 使用用戶自定義的比較函數對數組中的鍵名進行排序
usort 使用用戶自定義的比較函數對數組中的值進行排序,不保持索引關聯