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 相关文章推荐
对javascript和select部件的结合运用
Oct 09 PHP
php面向对象全攻略 (十七) 自动加载类
Sep 30 PHP
在PHP中使用反射技术的架构插件使用说明
May 18 PHP
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
Jul 23 PHP
PHP使用正则表达式获取微博中的话题和对象名
Jul 18 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
Dec 17 PHP
Yii遍历行下每列数据的方法
Oct 17 PHP
yii2利用自带UploadedFile实现上传图片的示例
Feb 16 PHP
Yii2配置Nginx伪静态的方法
May 05 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 PHP
PHP swoole和redis异步任务实现方法分析
Aug 12 PHP
Yii框架应用组件用法实例分析
May 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数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
2011/10/31 PHP
解析PHP对现有搜索引擎的调用
2013/06/25 PHP
使用phpQuery采集网页的方法
2013/11/13 PHP
php文件上传的例子及参数详解
2013/12/12 PHP
分享最受欢迎的5款PHP框架
2014/11/27 PHP
php随机抽奖实例分析
2015/03/04 PHP
PHP登录验证码的实现与使用方法
2016/07/07 PHP
js写一个字符串转成驼峰的实例
2013/06/21 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
2017/01/11 Javascript
移动端刮刮乐的实现方式(js+HTML5)
2017/03/23 Javascript
node.js 发布订阅模式的实例
2017/09/10 Javascript
Vue.js devtool插件安装后无法使用的解决办法
2017/11/27 Javascript
Vue插件从封装到发布的完整步骤记录
2019/02/28 Javascript
JS删除数组指定值常用方法详解
2020/06/04 Javascript
vue 单页应用和多页应用的优劣
2020/10/22 Javascript
[43:43]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第三场 11.29
2020/12/02 DOTA
python获取android设备的GPS信息脚本分享
2015/03/06 Python
django在接受post请求时显示403forbidden实例解析
2018/01/25 Python
解决python3读取Python2存储的pickle文件问题
2018/10/25 Python
使用Python 正则匹配两个特定字符之间的字符方法
2018/12/24 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
浅谈python多线程和多线程变量共享问题介绍
2020/04/17 Python
opencv 形态学变换(开运算,闭运算,梯度运算)
2020/07/07 Python
几款Python编译器比较与推荐(小结)
2020/10/15 Python
matplotlib相关系统目录获取方式小结
2021/02/03 Python
Geekbuying波兰:购买中国电子产品
2019/10/20 全球购物
面向对象概念面试题(.NET)
2016/11/04 面试题
网吧收银员岗位职责
2013/12/14 职场文书
餐饮加盟计划书
2014/01/10 职场文书
单位刻章介绍信范文
2014/01/11 职场文书
毕业生就业协议书
2014/04/11 职场文书
《音乐之都维也纳》教学反思
2014/04/16 职场文书
小学二年级学生评语
2014/04/21 职场文书
项目申报专员岗位职责
2014/07/09 职场文书
好人好事新闻稿
2015/07/17 职场文书
postgresql之greenplum字符串去重拼接方式
2023/05/08 PostgreSQL