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调用mysql存储过程
Feb 14 PHP
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
Sep 30 PHP
php短址转换实现方法
Feb 25 PHP
Windows7下的php环境配置教程
Feb 28 PHP
PHP使用缓存即时输出内容(output buffering)的方法
Aug 03 PHP
PHP合并discuz用户脚本的方法
Aug 04 PHP
PHP环境中Memcache的安装和使用
Nov 05 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
Mar 21 PHP
XHProf报告字段含义的解析
May 17 PHP
老生常谈PHP中的数据结构:DS扩展
Jul 17 PHP
Laravel中日期时间处理包Carbon的简单使用
Sep 21 PHP
PHP数组式访问接口ArrayAccess用法分析
Dec 28 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编程风格规范分享
2014/01/15 PHP
Laravel框架在本地虚拟机快速安装的方法详解
2018/06/11 PHP
Jquery 获取checkbox的checked问题
2011/11/16 Javascript
jquery JSON的解析方式示例介绍
2014/07/27 Javascript
jQuery的deferred对象详解
2014/11/12 Javascript
JavaScript简单表格编辑功能实现方法
2015/04/16 Javascript
javascript实现类似于新浪微博搜索框弹出效果的方法
2015/07/27 Javascript
javascript如何定义对象数组
2016/06/07 Javascript
JavaScript 闭包详细介绍
2016/09/28 Javascript
jquery仿京东侧边栏导航效果
2017/03/02 Javascript
canvas实现爱心和彩虹雨效果
2017/03/09 Javascript
微信JSAPI Ticket接口签名详解
2020/06/28 Javascript
本地存储localStorage用法详解
2017/07/31 Javascript
在vue中使用vue-echarts-v3的实例代码
2018/09/13 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
2019/09/10 Javascript
[01:02:02]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第二局
2016/02/25 DOTA
Python正则替换字符串函数re.sub用法示例
2017/01/19 Python
opencv python 图像去噪的实现方法
2018/08/31 Python
tensorflow实现加载mnist数据集
2018/09/08 Python
Python判断以什么结尾以什么开头的实例
2018/10/27 Python
python 在threading中如何处理主进程和子线程的关系
2020/04/25 Python
智能家居、吸尘器、滑板车、电动自行车网上购物:Geekmaxi
2021/01/18 全球购物
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
MySQL面试题目集锦
2016/04/14 面试题
公司年会晚宴演讲稿
2014/01/06 职场文书
军训自我鉴定100字
2014/02/13 职场文书
带香烟到学校抽的检讨书
2014/09/25 职场文书
实习生矿工检讨书
2014/10/13 职场文书
2015年暑期社会实践活动总结
2015/03/27 职场文书
防震减灾主题班会
2015/08/14 职场文书
《三国志》赏析
2019/08/27 职场文书
2020年元旦晚会策划书模板
2019/12/30 职场文书
Go语言中break label与goto label的区别
2021/04/28 Golang
只用50行Python代码爬取网络美女高清图片
2021/06/02 Python
Python机器学习应用之工业蒸汽数据分析篇详解
2022/01/18 Python