介绍array_multisort方法

介绍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)
      }
    }

  

原文地址:https://www.cnblogs.com/applelife/p/10516136.html

时间: 2024-08-29 22:16:20

介绍array_multisort方法的相关文章

WP移动设备压缩与解压控件Xceed Zip for .NET Compact Framework控件下载及详细介绍使用方法

Xceed Zip for .NET Compact Framework 控件是一款健全的文件压缩和解压缩控件,提供了灵活的ZIP.gZip.流压缩,分割和合并ZIP,创建自定义解压文件. 具体功能: 完全支持.NET Compact Framework 2.0以及以上 100%可管理的代码,由C#编写,面向对象设计 支持在硬盘.内存.FTP站点里创建新的ZIP文件,或者更新存在的ZIP文件 完全兼容WinZip12,支持LZMA算法 支持Zip64 Zip文件格式,对文件大小没有限制 支持从硬

php数组合并方法array_merge + 排序array_multisort方法

$dingdan = array_merge($jie_dingdan,$user_dingdan);//数组合并方法 $orderFile = array(); foreach($dingdan as $vo){ $orderFile[]=$vo['time']; } array_multisort($orderFile ,SORT_DESC, $dingdan );//数组合并后排序方法需要的值:按照哪个字段排序,升降排序(SORT_DESC升序 SORT_ASC降序),合并后的数组 原文地

LibSvm介绍---调用方法及参数介绍

    libsvm是著名的SVM开源组件,目前有JAVA.C/C++,.NET 等多个版本,本人使用的是2.82 libsvm命名空间下主要使用类: svm_model 为模型类,通过训练或加载训练好的模型文件获得 svm_parameter 为参数类,主要为支持向量机设定参数,具体参数如下: svm_parameter.svm_typesvm类型:SVM设置类型(默认svm_parameter.C_SVC)svm_parameter.C_SVC -- C-SVCsvm_parameter.N

java中所有Map大总结并介绍使用方法

一.Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复.所以通过指定的key就可以取出对应的value.Map接口定义了如下常用的方法:1.void clear():删除Map中所以键值对.2.boolean containsKey(Object key):查询Map中是否包含指定key,如果包含则返回true.3.boolean containsValue(Object value):查询Map中是否包含指定value

UITableView 删除行和行排序 这里只介绍代理方法

#pragma mark -代理方法 #pragma mark 设置cell表格高度 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ return 60; } #pragma mark 当cell实行编辑功能时调用 -(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableVi

python+selenium之中类/函数/模块的简单介绍和方法调用

1 # coding=utf-8 2 3 class ClassA (object): 4 string1 = "这是一个字符串." 5 6 def instancefunc(self): 7 print ('这是一个实例方法.') 8 print ('selef的值为:', self) 9 10 @classmethod 11 def classfunc(cls): 12 print ('这是一个类方法.') 13 print ('cls的值为:',cls) 14 15 @stati

函数的介绍与方法

函数的介绍 1.什么是函数:为什么要有函数 答:(1)组织代码结构不清晰 可读性差 (2) 代码冗余 (3) 管理维护的难度很大 扩展性 (4) 在具备某一个功能的工具就是程序中的函数 事先准备工具的过程-->函数的定义 --> 拿来就用 --> 函数的调用 (5) 函数的执行过程必须遵循:先定义 在调用 2.函数的定义 def 函数名(参数1,参数2,...): ''' 文档注释 ''' pass --> 代码块 return 值 ##3.定义阶段 def print_sym(s

lua 4 使用table实现其他数据结构,并介绍遍历方法

本文会以vector / map / set 这三种数据类型的角度来梳理 table 支持的不同遍历方式. table as array / vector 一般,C/C++中的 array / vector (下文简称 vector) 是没有 key.但是在 lua 中使用了 table 这种通用结构,就引入了 key 的问题. 在这里,把想用做 vector 的 table,做一个非常重要的约定:1 初始,key 连续.由于 table 的自由度很高,这个需要开发者自己约束. ---- 新建

HTTP介绍及方法状态码

import socket #创建一个socket对象 sk = socket.socket() #绑定ip和端口 sk.bind(("127.0.0.1", 8050)) #监听 sk.listen() #等待连接 while True: conn,addr=sk.accept() #接收数据 data = conn.recv(1024) #打印接收的数据 print(data) #发送数据 conn.send(b"ok") #断开连接 conn.close()