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系统流量分析的程序
Oct 09 PHP
基于mysql的bbs设计(一)
Oct 09 PHP
php 表单数据的获取代码
Mar 10 PHP
PHP 批量删除数据的方法分析
Oct 30 PHP
ThinkPHP查询返回简单字段数组的方法
Aug 25 PHP
自定义session存储机制避免会话保持问题
Oct 08 PHP
php判断类是否存在函数class_exists用法分析
Nov 14 PHP
WordPress网站性能优化指南
Nov 18 PHP
PHP图片加水印实现方法
May 06 PHP
php微信公众账号开发之前五个坑(一)
Sep 18 PHP
PHP使用XMLWriter读写xml文件操作详解
Jul 31 PHP
lnmp安装多版本PHP共存的方法详解
Aug 02 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为表单获取的URL 地址预设 http 字符串函数代码
2010/05/26 PHP
PHP分页效率终结版(推荐)
2013/07/01 PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
2014/06/20 PHP
php导出生成word的方法
2015/12/25 PHP
如何判断图片地址是否失效
2007/02/02 Javascript
javascript 程序库的比较(一)之DOM功能
2010/04/07 Javascript
一个可拖拽列宽表格实例演示
2012/11/26 Javascript
document.documentElement的一些使用技巧
2013/04/18 Javascript
js复制到剪切板的实例方法
2013/06/28 Javascript
win7下安装配置node.js+express开发环境
2015/12/06 Javascript
javascript运算符——逻辑运算符全面解析
2016/06/27 Javascript
JS传递对象数组为参数给后端,后端获取的实例代码
2016/06/28 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
2017/03/03 Javascript
js实现简单的获取验证码按钮效果
2017/03/03 Javascript
ReactNative列表ListView的用法
2017/08/02 Javascript
React 组件间的通信示例
2018/06/14 Javascript
node.js中express模块创建服务器和http模块客户端发请求
2019/03/06 Javascript
Element ui 下拉多选时新增一个选择所有的选项
2019/08/21 Javascript
JS实现电商商品展示放大镜特效
2020/01/07 Javascript
详解vue v-model
2020/08/31 Javascript
详解JavaScript作用域、作用域链和闭包的用法
2020/09/03 Javascript
vue项目打包后请求地址错误/打包后跨域操作
2020/11/04 Javascript
[01:10]3.19DOTA2发布会 三代刀塔人第一代
2014/03/25 DOTA
用Python实现一个简单的能够上传下载的HTTP服务器
2015/05/05 Python
Windows上使用virtualenv搭建Python+Flask开发环境
2016/06/07 Python
关于Python中Inf与Nan的判断问题详解
2017/02/08 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
2019/08/02 Python
Pytorch中的自动求梯度机制和Variable类实例
2020/02/29 Python
Python读取二进制文件代码方法解析
2020/06/22 Python
python 制作磁力搜索工具
2021/03/04 Python
Ted Baker美国官网:英国时尚品牌
2018/10/29 全球购物
某公司C#程序员面试题笔试题
2014/05/26 面试题
法定代表人授权委托书
2014/09/19 职场文书
捐款感谢信
2015/01/20 职场文书
幼儿园大班教师个人工作总结
2015/02/05 职场文书
增值税发票丢失证明
2015/06/19 职场文书