ホームページ > php教程 > php手册 > PHP 多维数组排序 保持索引对应关系 巧用 uasort

PHP 多维数组排序 保持索引对应关系 巧用 uasort

WBOY
リリース: 2016-06-13 09:35:37
オリジナル
904 人が閲覧しました

实际开发中,多多少少都会遇到数组的排序问题,除了常规的写简单的排序算法,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  使用用户自定义的比较函数对数组中的值进行排序,不保持索引关联

 

 

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート