實際開發中,多多少少都會遇到數組的排序問題,除了常規的寫簡單的排序算法,PHP 還提供了內置數組排序函數,本次重點分享一下:uasort 使用用戶自定義的比較函數對數組中的值進行排序並保持索引關聯,可排序多維數組,本文重點講解此函數。 uasort 函數 參數類型:bool uasort ( array &$array, callable $cmp_function) 本函數對數組排序並保持索引和單元之間的關聯。 主要用於對那些單元順序很重要的結合數組進行排序。比較函數是用戶自定義的。 成功時返回 TRUE, 或者在失敗時返回 FALSE。 數組排序實例(非class中): 復制代碼 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中): 復制代碼 /** * 自定義排序函數 * @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中排序,為了方便以二維數組為例: 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 使用用戶自定義的比較函數對數組中的值進行排序,不保持索引關聯