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 相关文章推荐
一篇有意思的技术文章php介绍篇
Oct 26 PHP
php cc攻击代码与防范方法
Oct 18 PHP
Linux中用PHP判断程序运行状态的2个方法
May 04 PHP
php向js函数传参的几种方法
Aug 10 PHP
php递归法读取目录及文件的方法
Jan 30 PHP
PHP实现的json类实例
Jul 28 PHP
PHP编写RESTful接口的方法
Feb 21 PHP
php封装的验证码类分享
Feb 26 PHP
实例讲解YII2中多表关联的使用方法
Jul 21 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
Apr 04 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
Apr 16 PHP
PHP设计模式之适配器模式(Adapter)原理与用法详解
Dec 12 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数组总结篇(一)
2008/09/30 PHP
phpQuery占用内存过多的处理方法
2013/11/13 PHP
php导入csv文件碰到乱码问题的解决方法
2014/02/10 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
2014/11/22 PHP
js window.event对象详尽解析
2009/02/17 Javascript
JavaScript 动态添加表格行 使用模板、标记
2009/10/24 Javascript
jquery库文件略庞大用纯js替换jquery的方法
2014/08/12 Javascript
JavaScript不刷新实现浏览器的前进后退功能
2014/11/05 Javascript
移动端JQ插件hammer使用详解
2015/07/03 Javascript
javascript数组去重的六种方法汇总
2015/08/16 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
JS简单实现查看文档创建日期、修改日期和文档大小的方法示例
2018/04/08 Javascript
react 兄弟组件如何调用对方的方法示例
2018/10/23 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
2019/08/23 Javascript
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
2020/02/11 Javascript
python调用cmd命令行制作刷博器
2014/01/13 Python
Python模拟登录12306的方法
2014/12/30 Python
python简单线程和协程学习心得(分享)
2017/06/14 Python
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
python 读文件,然后转化为矩阵的实例
2018/04/23 Python
python爬虫获取百度首页内容教学
2018/12/23 Python
用Anaconda安装本地python包的方法及路径问题(图文)
2019/07/16 Python
使用coverage统计python web项目代码覆盖率的方法详解
2019/08/05 Python
Pytorch实现LSTM和GRU示例
2020/01/14 Python
Python读取多列数据以及用matplotlib制作图表方法实例
2020/09/23 Python
python3爬虫中多线程进行解锁操作实例
2020/11/25 Python
python基于pexpect库自动获取日志信息
2021/02/01 Python
CSS3中的transform属性进行2D和3D变换的基本用法
2016/05/12 HTML / CSS
html通过canvas转成base64的方法
2019/07/18 HTML / CSS
群胜软件Java笔试题
2012/09/29 面试题
产品销售员岗位职责
2013/12/18 职场文书
住房公积金接收函
2014/01/09 职场文书
群众路线党课主持词
2014/04/01 职场文书
演讲稿格式
2014/04/30 职场文书
员工趣味活动方案
2014/08/27 职场文书
SQL IDENTITY_INSERT作用案例详解
2021/08/23 MySQL