php array_map array_multisort 高效处理多维数组排序


Posted in PHP onJune 11, 2009

对多维数组排序,通用的作法是
1 获取利用排序的数据并且将其放入数组$arrSort. 其中键索引为要排序数组的索引,保证唯一性
2 利用排序函数sort等对$arrSort进行排序.
3 遍历$arrSort, 根据其索引,获取多维数组的数据,重新构造排序后的多维数组.

Array 
( 
[0] => Array 
( 
[link] => test 
[name] => test.rpm 
[type] => file 
[size] => 988.9k 
[mtime] => 1185160178) 
.... 
)

I 很久以前在网上找到的一个排序函数,谈不上高效,但很实用
_array_sort($arrFile, 1, 1);//根据name字段排序 
_array_sort($arrFile, 3, 1);//根据size字段排序 
/* 
@records 要排序的数组 
@field要排序的字段,注意是数字 
@reverse正序还是反序 
*/ 
function _array_sort($records, $field, $reverse, $defaultSortField = 0) 
{ 
$uniqueSortId = 0; 
$hash = array(); 
$sortedRecords = array(); 
$tempArr = array(); 
$indexedArray = array(); 
$recordArray = array(); foreach($records as $record) 
{ 
$uniqueSortId++; 
$recordStr = implode("|", $record)."|".$uniqueSortId; 
$recordArray[] = explode("|", $recordStr); 
} 
$primarySortIndex = count($record); 
$records = $recordArray; 
foreach($records as $record) 
{ 
$hash[$record[$primarySortIndex]] = $record[$field]; 
} 
uasort($hash, "strnatcasecmp"); 
if($reverse) 
$hash = array_reverse($hash, true); 
$valueCount = array_count_values($hash); 
foreach($hash as $primaryKey => $value) 
{ 
$indexedArray[] = $primaryKey; 
} 
$i = 0; 
foreach($hash as $primaryKey => $value) 
{ 
$i++; 
if($valueCount[$value] > 1) 
{ 
foreach($records as $record) 
{ 
if($primaryKey == $record[$primarySortIndex]) 
{ 
$tempArr[$record[$defaultSortField]."__".$i] = $record; 
break; 
} 
} 
$index = array_search($primaryKey, $indexedArray); 
if(($i == count($records)) || ($value != $hash[$indexedArray[$index+1]])) 
{ 
uksort($tempArr, "strnatcasecmp"); 
if($reverse) 
$tempArr = array_reverse($tempArr); 
foreach($tempArr as $newRecs) 
{ 
$sortedRecords [] = $newRecs; 
} 
$tempArr = array(); 
} 
} 
else 
{ 
foreach($records as $record) 
{ 
if($primaryKey == $record[$primarySortIndex]) 
{ 
$sortedRecords[] = $record; 
break; 
} 
} 
} 
} 
return $sortedRecords; 
}

II 用array_map和array_mutisort来排序
array_mutisort还可以根据多个值来进行二次或者三次排序,这是上一个函数所不能比的.
利用array_map获取要依据排序的数组 
$arrField = array_map(create_function('$n', 'return $n["size"];'), $arrFile); 
//利用array_mutisort来进行排序 
$array_multisort($arrField, SORT_DESC, $arrFile);

III 最终测试
以188条数据的数组进行测试, 排序50次求平均值.
第一种方式
0.04269016 name
0.04267142 size
第二种方式
0.001249 name
0.00083924 size

结果不言而喻

PHP 相关文章推荐
随时给自己贴的图片加文字的php水印
Mar 16 PHP
一家之言的经验之谈php+mysql扎实个人基本功
Mar 27 PHP
php 结果集的分页实现代码
Mar 10 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
Jan 26 PHP
ecshop后台编辑器替换成ueditor编辑器
Mar 03 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
Dec 08 PHP
Laravel重写用户登录简单示例
Oct 08 PHP
php rmdir使用递归函数删除非空目录实例详解
Oct 20 PHP
PHP使用Redis替代文件存储Session的方法
Feb 15 PHP
浅谈Laravel队列实现原理解决问题记录
Aug 19 PHP
php二维码生成以及下载实现
Sep 28 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
Oct 17 PHP
php MsSql server时遇到的中文编码问题
Jun 11 #PHP
php 分页类 扩展代码
Jun 11 #PHP
PHP 输出简单动态WAP页面
Jun 09 #PHP
Windows PHP5和Apache的安装与配置
Jun 08 #PHP
phpMyAdmin 安装配置方法和问题解决
Jun 08 #PHP
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
Jun 08 #PHP
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
Jun 08 #PHP
You might like
针对初学PHP者的疑难问答(2)
2006/10/09 PHP
php实现批量下载百度云盘文件例子分享
2014/04/10 PHP
利用PHP判断是否是连乘数字串的方法示例
2017/07/03 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
2018/04/04 PHP
PHP文件后缀不强制为.php方法
2019/03/31 PHP
在html页面中包含共享页面的方法
2008/10/24 Javascript
Javascript学习笔记5 类和对象
2010/01/11 Javascript
基于jquery的页面划词搜索JS
2010/09/14 Javascript
js写出遮罩层登陆框和对联广告并自动跟随滚动条滚动
2014/04/29 Javascript
jQuery选择器源码解读(一):Sizzle方法
2015/03/31 Javascript
jQuery on()方法使用技巧详解
2015/04/16 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
js遍历获取表格内数据的方法(必看)
2017/04/06 Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
2018/08/24 Javascript
Vue.js如何使用Socket.IO的示例代码
2019/09/05 Javascript
JS 数组和对象的深拷贝操作示例
2020/06/06 Javascript
在Python中使用PIL模块处理图像的教程
2015/04/29 Python
python中 chr unichr ord函数的实例详解
2017/08/06 Python
通过实例了解python property属性
2019/11/01 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
Ubuntu16安装Python3.9的实现步骤
2020/12/15 Python
Avène雅漾美国官方网站:敏感肌肤护理专家
2016/10/24 全球购物
英国手工制作的现代与经典的沙发和床:Love Your Home
2020/09/26 全球购物
数据库测试通常都包括哪些方面
2015/11/30 面试题
介绍一下RMI的基本概念
2016/12/17 面试题
税务专业毕业生自荐信
2013/11/10 职场文书
测控技术与仪器个人求职信范文
2013/12/30 职场文书
大学生创业策划书
2014/02/02 职场文书
大学生社会实践评语
2014/04/25 职场文书
访谈节目策划方案
2014/05/15 职场文书
纪念九一八爱国演讲稿600字
2014/09/14 职场文书
教师求职自荐信范文
2015/03/04 职场文书
2016春节放假通知范文
2015/08/18 职场文书
新员工实习期个人工作总结
2015/10/15 职场文书
小学英语教学经验交流材料
2015/11/02 职场文书
CSS实现两列布局的N种方法
2021/08/02 HTML / CSS