PHP 多維數組排序 保持索引對應關係 巧用 uasort

>>更多精彩文章,請詳見 http://www.web-lovers.com/php

實際開發中,多多少少都會遇到數組的排序問題,除了常規的寫簡單的排序算法,PHP 還提供了內置數組排序函數,本次重點分享一下:uasort  使用用戶自定義的比較函數對數組中的值進行排序並保持索引關聯,可排序多維數組,本文重點講解此函數。      web

 

uasort 函數算法

參數類型:bool uasort ( array &$array, callable $cmp_function)數組

本函數對數組排序並保持索引和單元之間的關聯。函數

主要用於對那些單元順序很重要的結合數組進行排序。比較函數是用戶自定義的。this

成功時返回 TRUE, 或者在失敗時返回 FALSEspa

 

數組排序實例(非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  使用用戶自定義的比較函數對數組中的值進行排序,不保持索引關聯

 

>>更多精彩文章,請詳見 http://web-lovers.com/

相關文章
相關標籤/搜索