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 的ArrayAccess接口 像数组一样来访问你的PHP对象
Oct 12 PHP
通过JavaScript或PHP检测Android设备的代码
Mar 09 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
Jan 10 PHP
PH P5.2至5.5、5.6的新增功能详解
Jul 14 PHP
PHP访问Google Search API的方法
Mar 05 PHP
深入浅出php socket编程
May 13 PHP
WordPress中自定义后台管理界面配色方案的小技巧
Dec 29 PHP
PHP和MySql中32位和64位的整形范围是多少
Feb 18 PHP
详解PHP的Yii框架的运行机制及其路由功能
Mar 17 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
Jun 13 PHP
常用PHP数组排序函数归纳
Aug 08 PHP
PHP实现求解最长公共子串问题的方法
Nov 17 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 PDO简单教程
2019/05/28 PHP
豆瓣网的jquery代码实例
2008/06/15 Javascript
extjs 列表框(multiselect)的动态添加列表项的方法
2009/07/31 Javascript
javascript 模式设计之工厂模式详细说明
2010/05/10 Javascript
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
2010/06/18 Javascript
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
关于js类的定义
2011/06/28 Javascript
jQuery EasyUI API 中文文档 - DataGrid数据表格
2011/11/17 Javascript
使用Javascript接收get传递的值的代码
2011/11/30 Javascript
jQuery使用动态渲染表单功能完成ajax文件下载
2013/01/15 Javascript
关于javascript event flow 的一个bug详解
2013/09/17 Javascript
DOM基础教程之事件对象
2015/01/20 Javascript
js实现显示当前状态的导航效果代码
2015/08/28 Javascript
JavaScript中两个字符串的匹配
2016/06/08 Javascript
简单实现node.js图片上传
2016/12/18 Javascript
angular $watch 一个变量的变化(实例讲解)
2017/08/02 Javascript
微信小程序 scroll-view实现锚点滑动的示例
2017/12/06 Javascript
vue组件开发之tab切换组件使用详解
2020/08/21 Javascript
[01:02:46]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
浅谈用VSCode写python的正确姿势
2017/12/16 Python
Django 使用logging打印日志的实例
2018/04/28 Python
django 连接数据库 sqlite的例子
2019/08/14 Python
python3中编码获取网页的实例方法
2020/11/16 Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
2020/11/30 Python
CSS3 实用技巧:实现黑白图像效果示例代码
2013/07/11 HTML / CSS
美国床垫和床上用品公司:Nest Bedding
2017/06/12 全球购物
开放系统互连参考模型
2016/06/29 面试题
幼儿园大班家长评语
2014/04/17 职场文书
小学感恩教育活动总结
2014/07/07 职场文书
人事行政专员岗位职责
2014/07/23 职场文书
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
工会文体活动总结
2015/05/07 职场文书
2016新教师培训心得体会范文
2016/01/08 职场文书
2016年社区六一儿童节活动总结
2016/04/06 职场文书
遇事可以测出您的见识与格局
2019/09/16 职场文书
解决Laravel使用验证时跳转到首页的问题
2021/11/17 PHP