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编实现程动态图像的创建代码
Sep 28 PHP
Linux下将excel数据导入到mssql数据库中的方法
Feb 08 PHP
php报表之jpgraph柱状图实例代码
Aug 22 PHP
wamp下修改mysql访问密码的解决方法
May 07 PHP
php实现上传图片保存到数据库的方法
Feb 11 PHP
PHP输出两个数字中间有多少个回文数的方法
Mar 23 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
Sep 22 PHP
PHP SFTP实现上传下载功能
Jul 26 PHP
thinkphp5 migrate数据库迁移工具
Feb 20 PHP
PHP设计模式之观察者模式定义与用法分析
Apr 04 PHP
Laravel模糊查询区分大小写的实例
Sep 29 PHP
WordPress多语言翻译插件 - WPML使用教程
Apr 01 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和js交互一例-PHP教程,PHP应用
2007/01/03 PHP
PHP与C#分别格式化文件大小的代码
2011/05/14 PHP
PHP 安全检测代码片段(分享)
2013/07/05 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
2013/11/13 PHP
php实现文件下载简单示例(代码实现文件下载)
2014/03/10 PHP
Javascript解析URL方法详解
2014/12/05 Javascript
JS实现从网页顶部掉下弹出层效果的方法
2015/08/06 Javascript
Bootstrap每天必学之折叠(Collapse)插件
2016/04/25 Javascript
实例解析Array和String方法
2016/12/14 Javascript
详细讲解vue2+vuex+axios
2017/05/27 Javascript
Ionic3 UI组件之Gallery Modal详解
2017/06/07 Javascript
浅谈Vue组件及组件的注册方法
2018/08/24 Javascript
你了解vue3.0响应式数据怎么实现吗
2019/06/07 Javascript
基于vue手写tree插件的那点事儿
2019/08/20 Javascript
微信小程序获取位置展示地图并标注信息的实例代码
2019/09/01 Javascript
原生Vue 实现右键菜单组件功能
2019/12/16 Javascript
el-table表头根据内容自适应完美解决表头错位和固定列错位
2021/01/07 Javascript
python用ConfigObj读写配置文件的实现代码
2013/03/04 Python
python里将list中元素依次向前移动一位
2014/09/12 Python
深入理解Python中命名空间的查找规则LEGB
2015/08/06 Python
Django应用程序中如何发送电子邮件详解
2017/02/04 Python
Django REST为文件属性输出完整URL的方法
2017/12/18 Python
python机器学习之决策树分类详解
2017/12/20 Python
python3中函数参数的四种简单用法
2018/07/09 Python
Python实现的tcp端口检测操作示例
2018/07/24 Python
Matplotlib中文乱码的3种解决方案
2018/11/15 Python
神经网络相关之基础概念的讲解
2018/12/29 Python
python config文件的读写操作示例
2019/09/27 Python
Pytorch .pth权重文件的使用解析
2020/02/14 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
2020/06/18 Python
Python 数据的累加与统计的示例代码
2020/08/03 Python
Pycharm新手使用教程(图文详解)
2020/09/17 Python
办公室文员工作自我评价
2013/12/01 职场文书
副检察长四风问题对照检查材料思想汇报
2014/10/07 职场文书
2015年园林绿化工作总结
2015/05/23 职场文书
Matplotlib绘制混淆矩阵的实现
2021/05/27 Python