php 多维数据根据某个或多个字段排序

实现多维数组的指定多个字段排序

上面的实例讲解了如何实现多维数组指定一个字段排序,但如果要实现指定多个字段来对数组进行排序该如何思考? 
多个字段是几个?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);

  

原文地址:https://www.cnblogs.com/sz-xioabai/p/10797726.html

时间: 2024-10-08 08:55:52

php 多维数据根据某个或多个字段排序的相关文章

二维数据名作形参

之前帮同学调一个程序的时候遇到的,把二维数据改为全局变量,不通过参数传递就没问题了,否则程序崩溃. 细究一下,二维数据名用于形参时需要注意哪些方面. 测试程序如下: #include<stdio.h> #include<stdlib.h> void print1(int **a, int m, int n); void print2(int (*a)[2], int m, int n); int main() { int a[2][2]={1,2,3,4}; print1((int

使用SVM对多类多维数据进行分类

最近,本人要做个小东西,使用SVM对8类三维数据进行分类,搜索网上,发现大伙讨论的都是二维数据的二分类问题,遂决定自己研究一番.本人首先参考了opencv的tutorial,这也是二维数据的二分类问题.然后通过学习研究,发现别有洞天,遂实现之前的目标.在这里将代码贴出来,这里实现了对三维数据进行三类划分,以供大家相互学习. #include "stdafx.h" #include <iostream> #include <opencv2/core/core.hpp&g

SSAS系列——【03】多维数据(多维数据集对象)

原文:SSAS系列--[03]多维数据(多维数据集对象) 1.什么是Cube? 简单 Cube 对象由基本信息.维度和度量值组组成. 基本信息包括多维数据集的名称.多维数据集的默认度量值.数据源和存储模式等.维度是多维数据集中使用的实际维度组.所有维度都必须先在数据库的维度集合中定义,然后才能在多维数据集中引用.度量值组是多维数据集中的度量值集.度量值组是具有常见数据源视图和维度集的度量值的集合.度量值组是度量值的处理单元:可先对度量值组进行单独处理,然后再浏览.这个概念MSND解释的非常清楚,

SSAS系列&mdash;&mdash;【02】多维数据(维度对象)

原文:SSAS系列——[02]多维数据(维度对象) 1.维度是什么? 数学中叫参数,物理学中是独立的时空坐标的数目.0维是一点,1维是线,2维是一个长和宽(或曲线)面积,3维是2维加上高度形成体积面.在物理学上时间是第四维,与三个空间维不同的是,它只有一个,且只能往一方向前进. 图一 MSDN中关于维度的概念 2.服务器对象的内容? 包括数据源.数据视图.数据库对象.安全角色和程序集.前4个都不难理解.关于程序集的概念,还需加强一下,程序集可为两种不同的类型:COM 和 CLR.CLR 程序集是

SSAS系列&mdash;&mdash;【04】多维数据(物理体系结构)

原文:SSAS系列——[04]多维数据(物理体系结构) 1.本地多维数据集 本地多维数据集和本地挖掘模型允许在客户端工作站与网络的连接断开时对该工作站进行分析.在与本地多维数据集进行交互时,ADMOD.NET 和 Analysis Management Objects (AMO) 也将加载本地多维数据集引擎.只有一个进程可以访问本地多维数据集文件,这是因为本地多维数据集引擎建立到本地多维数据集的连接时将以独占方式锁定本地多维数据集文件.对于一个进程,最多允许同时有五个连接.一个 .cub 文件可

SSAS系列——【05】多维数据(编程体系结构)

原文:SSAS系列--[05]多维数据(编程体系结构) 1.什么是AMO? 翻译:AMO是SSAS中一个完整的管理类集合,它在Microsoft.AnalysisServices命名空间下,我们可以在"\100\SDK\Assemblies\AnalysisServices.dll”中找到.使用AMO我们能够增删修改Cube.dimensions.Mining structure,Analysis Service Database,AMO不能够检索数据,要检索数据我们还必须使用ADOMD.NET

SSAS系列&mdash;&mdash;【07】多维数据(查询Cube)

原文:SSAS系列——[07]多维数据(查询Cube) 1.什么是MDX? MDX叫做"多维表达式",是一种查询语言,是一种和SQL类似的查询语言,它基于 XML for Analysis (XMLA) 规范,并带有特定于 SQL Server Analysis Services 的扩展. 2.MDX与SQL有什么区别? 学东西,总是喜欢"先入为主",在学习MDX的时候我第一个想法是:MDX与SQL有什么区别?其实搞清楚这个问题后,MDX是什么也就算搞清楚了.SQL

SSAS系列——【08】多维数据(程序展现Cube)

原文:SSAS系列--[08]多维数据(程序展现Cube) 1.引用DLL? 按照之前安装的MS SQLServer的步骤安装完成后,发现在新建的项目中“Add Reference”时居然找不到Microsoft.AnalysisServices.AdomdClient命名空间,不知道是什么状况?只好添加DLL了,在“C:\Program Files\Microsoft.NET\ADOMD.NET\100\Microsoft.AnalysisServices.AdomdClient.dll”下找

SSAS系列——【06】多维数据(创建Cube)

原文:SSAS系列--[06]多维数据(创建Cube) 1.文件类型说明 项目定义文件 (.dwproj).项目用户设置 (.dwproj.user).数据源文件 (.ds).数据源视图文件 (.dsv).多维数据集文件 (.cube).分区文件 (.partitions).维度文件 (.dim).挖掘结构文件 (.dmm).数据库文件 (.database).数据库角色文件 (.role).第一次启动,纪念贴. 图 启动界面 留念 图 默认文件夹中内容 2.创建数据源.数据源视图.维度.定义和