最近再写项目的时候,碰到一个问题:如何将一个或多个二维数组组合成一个二维数组并根据某个字段排序排序;实在是想不到哪个php库中有哪个函数能实现,只能自己写一个了,将代码写出来后,发现自己的代码繁琐,并且不宜封装成一个函数;经过跟请教同事之后,终于将代码精简并封装好;废话少说,请看下面代码,如有疑问,请评论。

//例:将以下三个数组合并成一个数据,并以 "sort" 字段排序

	$a = array(
array('sort'=>0),
array('sort'=>2),
array('sort'=>4),
);
$b = array(
array('sort'=>1),
array('sort'=>3),
array('sort'=>5),
);
$c = array(
array('sort'=>1),
array('sort'=>3),
array('sort'=>5),
); $e = sortDataByField('sort',1,$a,$b,$c);
print_r($e);
exit;
/**
* 将多个二维数组组合成一个二维数组并根据某个字段排序排序
* @param string $fun_args_arr[0] 要排序的字段
* @param string $fun_args_arr[1] 排序 0-倒序 1-正序
* @param string $fun_args_arr[2,3,4...] 二维数组
* 注意:
* 1、参数必须大于三个,
* 2、第一、第二个参数不能为数组
* 3、第一个参数必须包含再后面的数组中
*/
function sortDataByField(){ $fun_args_arr = func_get_args();//将传进来的数据整合成一个数组
$count = func_num_args(); // 统计传进来的数据个数
if($count <3){
exit("Parameter error: subter 3 parameters");
}
$field = $fun_args_arr[0];//要排序的字段
$sort = $fun_args_arr[1];// 0-倒序 1-正序
if(is_array($field) || is_array($sort)){
exit("Parameter 1 or parameter 2 cannot be an array");
}
$ret = $fun_args_arr[2]; //将多个二维数组组合成一个二维数组
for($i=3;$i < $count;$i++ ){
foreach($fun_args_arr[$i] as $k=>$v) {
$ret[] = $v;
// array_push($ret,$v);
}
}
//排序
for($i=0;$i < count($ret);$i++){
for($j=0;$j < $i;$j++){
if( !isset($ret[$i][$field]) || !isset($ret[$j][$field])){
exit("Parameter error: $field is not defined");
}
$a = $ret[$i][$field];
$b = $ret[$j][$field];
if($sort ^ $a-$b > 0){// ^ 异或运算符
$temp1 = $ret[$i];
$ret[$i] = $ret[$j];
$ret[$j] = $temp1;
$temp = $a;
$ret[$i][$field] = $b;
$ret[$j][$field] = $temp;
}
}
}
return $ret;
}

  

  

php 将一个或多个二维数组组合成一个二维数组并根据某个字段排序排序的更多相关文章

  1. Convert Sorted Array to Binary Search Tree(将一个有序数组转换成一颗二叉搜索树)

    Given an array where elements are sorted in ascending order, convert it to a height balanced BST. Fo ...

  2. php 统计二维数组中某个相等值的总个数,并且组合成一个新的数组 转发

    $ar = array(   array( 'sv_id' => 1, 'mid' => 1, 'sv_question1' => 20 ),   array( 'sv_id' =& ...

  3. C#/JS 获取二维数组组合

    C#获取二维数组组合 using System; using System.Collections.Generic; using System.Linq; using System.Text; usi ...

  4. Android 在资源文件(res/strings.xml)定义一维数组,间接定义二维数组

    经常我们会在资源文件(res/strings.xml)定义字符串,一维数组,那定义二维数组?直接定义二维数组没找到,可以间接定义. 其实很简单,看过用过一次就可以记住了,一维数组估计大家经常用到,但是 ...

  5. C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

    原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...

  6. 《剑指Offer》第1题(Java实现):在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

    一.题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该 ...

  7. 06-01 Java 二维数组格式、二维数组内存图解、二维数组操作

    二维数组格式1 /* 二维数组:就是元素为一维数组的一个数组. 格式1: 数据类型[][] 数组名 = new 数据类型[m][n]; m:表示这个二维数组有多少个一维数组. n:表示每一个一维数组的 ...

  8. C 二维数组,以及自定义二维数组

    C 二维数组,以及自定义二维数组 我们通常情况下是这样定义一个二维数组的: int a[10][15]; 我们分别查看一下a,a[0],*a 都是一样的值吧 我们可以这么理解: a是一个数组的数组 a ...

  9. PHP二维数组,根据多个字段来排序

    如果是最最常见的二维数组排序, 大多数情况下也只用到二维: 用php内置函数 array_multisort( )  是最简单的: <?php 假设, $arr 是一个二维数组, $arg1是取 ...

随机推荐

  1. Apollo与ROS

    Apollo项目基于ROS,但是对其进行了改造,主要包括下面三个方面: 通信性能优化 去中心化网络拓扑 数据兼容性扩展 通信性能优化 自动驾驶车辆中包含了大量的传感器,这些传感器可能以非常高频的速度产 ...

  2. 无法为具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer”。请确保使用限定程序集的名称且该程序集对运行的应用程序可用。有关详细信息,请参阅 http://go.m

    Windows服务中程序发布之后会如下错误: 无法为具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“Syste ...

  3. 关于 git 本地创建 SSH Key 遇到的一点问题(①file to save the key & ②the authenticity of host...)

    背景 由于想测试一下 SSH Key 创建的路径(.ssh 目录路径)对于不同位置 git 项目是否有效. 比如,.ssh 默认在 C:\[users]\[username] 目录下,而项目 proj ...

  4. 【Git】Git提交代码的正确姿势

    按此步骤基本没问题,中间有conflict,需要手动解决. 1.git stash 2.git pull 3.git stash pop 4.git add --xxx 5.git commit -m ...

  5. MTV 和 MVC

    MTV:(Django中用) M:models T:templates V:views MVC M:models V:views C:control(urls+views)

  6. 简单使用zabbix监控nginx是否存活

    1.在agent端修改主配置文件 vim /etc/zabbix/zabbix_agentd.conf ........ ........ UserParameter=nginx.status[*], ...

  7. Make a plan

    1. 思考 2. 学习英语 3. 练习书法 执行周期:2015年1月15日到2016年1月16日. 要像每一次用餐一样对待每一天的计划. 早晨起来,第一件事情是洗漱,然后是思考: 中午时间,第一件事情 ...

  8. 最长共公子序列(LCS)

    #include <iostream> #include <cstdio> #include <algorithm> using namespace std; ], ...

  9. vue修改项目名

    1.修改config/index.js文件 2.修改Router内容 vue跨域设置

  10. Mybatis 源码学习系列

    前言 很久以前,我们学习了Java,从一个控制台的 Hello world .开始,我们进入了面向对象的世界. 然后由学习了SQL语言,可以写出SQL语句来将尘封在硬盘之下的数据库数据,展现出来. 后 ...