首页 > 编程 > PHP > 正文

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

2020-03-22 18:27:59
字体:
来源:转载
供稿:网友
  • 实际开发中,多多少少都会遇到数组的排序问题,除了常规的写简单的排序算法,PHP 还提供了内置数组排序函数,本次重点分享一下:uasort使用用户自定义的比较函数对数组中的值进行排序并保持索引关联,可排序多维数组,本文重点讲解此函数。

    uasort 函数

    参数类型:booluasort(array &$array,callable $cmp_function)

    本函数对数组排序并保持索引和单元之间的关联。

    主要用于对那些单元顺序很重要的结合数组进行排序。比较函数是用户自定义的。

    成功时返回TRUE, 或者在失败时返回FALSE

    数组排序实例(非html' target='_blank'>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编程

    郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表