PHP多维数组指定多字段排序的示例代码


Posted in PHP onMay 16, 2018

介绍array_multisort方法

array_multisort — 对多个数组或多维数组进行排序.其php 手册中的说明如下:

bool array_multisort ( array &$arr [, mixed $arg = SORT_ASC [, mixed $arg = SORT_REGULAR [, mixed $... ]]] )

参数

arr
要排序的一个 array。

arg
接下来的每个参数可以是另一个 array 或者是为之前 array 排序标志选项参数: SORT_ASC, SORT_DESC,SORT_REGULAR, SORT_NUMERIC, SORT_STRING.

Additional arg's.

先实现指定多维数组一个字段排序

此处要求根据其中的一个字段来对数组进行排序,数组假设如下:

$array = array(
      0=>array('id'=>8,'name'=>'Tom'),
      1=>array('id'=>9,'name'=>'Peter'),
      2=>array('id'=>5,'name'=>'Jack')
  );

我们要根据二维数组的id值来排序,转换后的数组格式如下:

$array = array(
      0=>array('id'=>5,'name'=>'Jack')
      1=>array('id'=>8,'name'=>'Tom'),
      2=>array('id'=>9,'name'=>'Peter')
  );

要完成上述的转换,需要用到上面介绍的array_multisort函数,如下:

function sortArrByOneField(&$array, $field, $desc = false){
    $fieldArr = array();
    foreach ($array as $k => $v) {
     $fieldArr[$k] = $v[$field];
    }
    $sort = $desc == false ? SORT_ASC : SORT_DESC;
    array_multisort($fieldArr, $sort, $array);
  }

通过将待排序数组的各个数组的$field保存在一位数组fieldArr中,在传入array_multisort中参与排序。其中field数组的值如下:

array(0=>8,1=>9,2=>5)

传入 array_multisort后,相当于对$field一维数组的排序,而后根据排序后的key重新构建传入的待排序数组。

实现多维数组的指定多个字段排序

上面的实例讲解了如何实现多维数组指定一个字段排序,但如果要实现指定多个字段来对数组进行排序该如何思考?
多个字段是几个?2个,3个或更多,所以这个不确定的因素需要排除。

我们先来看2指定2个字段进行排序的方案:

$arr = array(
    '0' => array(
      'id' => 3,
      'age' => 27 
    ),
    '1' => array(
      'id' => 5,
      'age' => 50
    ),
    '2' => array(
      'id' => 4,
      'age' => 44
    ),
    '3' => array(
      'id' => 3,
      'age' => 78
    ) 
  );
  foreach ( $arr as $key => $row ){
    $id[$key] = $row ['id'];
    $age[$key] = $row ['age'];
  }
  array_multisort($id, SORT_ASC, $age, SORT_DESC, $arr);
  print_r($arr);
  //result:Array([0]=>Array(['id']=>3 ['age']=>78) [1]=>Array(['id']=>3 ['age']=>27) [2]=>Array(['id']=>4 ['age']=>44) [3]=>Array(['id']=>5 ['age']=>50))

重构上述代码,只要采用php中的func_get_args函数,来动态获取传入的值,既可以解决多字段个数不确定的问题。实现如下:

$array1 = array(
        0=>array('id'=>8,'name'=>'Apple','age'=> 18),
        1=>array('id'=>8,'name'=>'Bed','age'=>17),
        2=>array('id'=>5,'name'=>'Cos','age'=>16),
        3=>array('id'=>5,'name'=>'Cos','age'=>14)
  );
  function sortArrByManyField(){
    $args = func_get_args();
    if(empty($args)){
      return null;
    }
    $arr = array_shift($args);
    if(!is_array($arr)){
      throw new Exception("第一个参数不为数组");
    }
    foreach($args as $key => $field){
      if(is_string($field)){
        $temp = array();
        foreach($arr as $index=> $val){
          $temp[$index] = $val[$field];
        }
        $args[$key] = $temp;
      }
    }
    $args[] = &$arr;//引用值
    call_user_func_array('array_multisort',$args);
    return array_pop($args);
  }
  $arr = sortArrByManyField($array1,'id',SORT_ASC,'name',SORT_ASC,'age',SORT_DESC);
  print_r($arr);

运行结果如下:

    array(4) {
      [0]=>array(3) {
            ["id"]=>int(5)
            ["name"]=>string(3) "Cos"
            ["age"]=>int(16)
          }
      [1]=>array(3) {
            ["id"]=>int(5)
            ["name"]=>string(3) "Cos"
            ["age"]=>int(14)
          }
      [2]=>array(3) {
            ["id"]=>int(8)
            ["name"]=>string(5) "Apple"
            ["age"]=>int(18)
          }
      [3]=>array(3) {
            ["id"]=>int(8)
            ["name"]=>string(3) "Bed"
            ["age"]=>int(17)
      }
    }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHPlet在Windows下的安装
Oct 09 PHP
PHP添加MySQL数据记录代码
Jun 07 PHP
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
May 17 PHP
PHP连接MySQL查询结果中文显示乱码解决方法
Oct 25 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
Feb 18 PHP
php集成环境xampp中apache无法启动问题解决方案
Nov 18 PHP
php对文件进行hash运算的方法
Apr 03 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
Jan 22 PHP
PHP7常量数组用法分析
Sep 26 PHP
CI框架实现优化文件上传及多文件上传的方法
Jan 04 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
Apr 21 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
Oct 15 PHP
php strftime函数获取日期时间(switch用法)
May 16 #PHP
Phpstorm+Xdebug断点调试PHP的方法
May 14 #PHP
Laravel 集成 Geetest验证码的方法
May 14 #PHP
PHP 多任务秒级定时器的实现方法
May 13 #PHP
原生JS实现Ajax通过POST方式与PHP进行交互的方法示例
May 12 #PHP
原生JS实现Ajax通过GET方式与PHP进行交互操作示例
May 12 #PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
May 12 #PHP
You might like
PHP和Mysqlweb应用开发核心技术-第1部分 Php基础-2 php语言介绍
2011/07/03 PHP
两种设置php载入页面时编码的方法
2014/07/29 PHP
微信支付开发订单查询实例
2016/07/12 PHP
Yii视图操作之自定义分页实现方法
2016/07/14 PHP
雄兵连第三季海报曝光,艾妮熙德成主角,蔷薇新造型
2021/03/09 国漫
js实现简单模态窗口,背景灰显
2008/11/14 Javascript
Javascript Cookie读写删除操作的函数
2010/03/02 Javascript
单击浏览器右上角的X关闭窗口弹出提示的小例子
2013/06/12 Javascript
jquery获取css中的选择器(实例讲解)
2013/12/02 Javascript
js解析json读取List中的实体对象示例
2014/03/11 Javascript
node.js操作mysql(增删改查)
2015/07/24 Javascript
Node.js实用代码段之正确拼接Buffer
2016/03/17 Javascript
利用vueJs实现图片轮播实例代码
2017/06/03 Javascript
elementUI Vue 单个按钮显示和隐藏的变换功能(两种方法)
2018/09/04 Javascript
详解vue文件中使用echarts.js的两种方式
2018/10/18 Javascript
Node.js创建一个Express服务的方法详解
2020/01/06 Javascript
Vue 技巧之控制父类的 slot
2020/02/24 Javascript
Python实现的检测网站挂马程序
2014/11/30 Python
Python魔术方法详解
2015/02/14 Python
python fabric实现远程部署
2017/01/05 Python
python tensorflow基于cnn实现手写数字识别
2018/01/01 Python
教你用Python写安卓游戏外挂
2018/01/11 Python
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
Django使用详解:ORM 的反向查找(related_name)
2018/05/30 Python
python写程序统计词频的方法
2019/07/29 Python
python tkinter实现彩球碰撞屏保
2019/07/30 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
2019/10/30 Python
大众服装店创业计划书范文
2014/01/01 职场文书
装修协议书范本
2014/04/21 职场文书
建筑工程专业大学生求职信
2014/04/23 职场文书
天地会口号
2014/06/17 职场文书
银行党员批评与自我批评
2014/10/15 职场文书
2015年教师新年寄语
2014/12/08 职场文书
毕业生个人总结
2015/02/28 职场文书
2015中学学校工作总结
2015/07/20 职场文书
导游词之青岛太清宫
2019/12/13 职场文书