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 相关文章推荐
Win2003服务器安全加固设置--进一步提高服务器安全性
May 23 PHP
php获取mysql版本的几种方法小结
Mar 25 PHP
php split汉字
Jun 05 PHP
PHP 文件上传源码分析(RFC1867)
Oct 30 PHP
Zend的MVC机制使用分析(二)
May 02 PHP
php中curl和file_get_content的区别
May 10 PHP
最新版本PHP 7 vs HHVM 多角度比较
Feb 14 PHP
php结合md5的加密解密算法实例
Sep 30 PHP
php自定义扩展名获取函数示例
Dec 12 PHP
PHP扩展mcrypt实现的AES加密功能示例
Jan 29 PHP
Laravel框架创建路由的方法详解
Sep 04 PHP
PHP实现通过二维数组键值获取一维键名操作示例
Oct 11 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 事务处理数据实现代码
2010/05/13 PHP
php下通过IP获取地理位置的代码(小偷程序)
2011/06/09 PHP
PHP基于php_imagick_st-Q8.dll实现JPG合成GIF图片的方法
2014/07/11 PHP
mod_php、FastCGI、PHP-FPM等PHP运行方式对比
2015/07/02 PHP
在WordPress的文章编辑器中设置默认内容的方法
2015/12/29 PHP
php文件上传、下载和删除示例
2020/08/28 PHP
详解阿里云视频直播PHP-SDK接入教程
2020/07/09 PHP
js Date自定义函数 延迟脚本执行
2010/03/10 Javascript
javascript动态改变img的src属性图片不显示的解决方法
2010/10/20 Javascript
jQuery操作input值的各种方法总结
2013/11/21 Javascript
用js正确判断用户名cookie是否存在的方法
2014/01/28 Javascript
jquery+html5烂漫爱心表白动画代码分享
2015/08/24 Javascript
js获取及判断键盘按键的方法
2015/12/01 Javascript
JS中的二叉树遍历详解
2016/03/18 Javascript
为jQuery-easyui的tab组件添加右键菜单功能的简单实例
2016/10/10 Javascript
vue.js开发环境安装教程
2017/03/17 Javascript
webpack实现热更新(实施同步刷新)
2017/07/28 Javascript
js 中rewrap-ajax.js插件实例代码
2017/10/20 Javascript
详解vue静态资源打包中的坑与解决方案
2018/02/05 Javascript
详解小程序设置缓存并且不覆盖原有数据
2019/04/15 Javascript
python使用MySQLdb访问mysql数据库的方法
2015/08/03 Python
如何用Python实现简单的Markdown转换器
2018/07/16 Python
如何使用Python进行OCR识别图片中的文字
2019/04/01 Python
Flask模板引擎之Jinja2语法介绍
2019/06/26 Python
python如何实现不可变字典inmutabledict
2020/01/08 Python
基于 HTML5 Canvas实现 的交互式地铁线路图
2018/03/05 HTML / CSS
优秀的2014年两会精神解读
2014/03/17 职场文书
《金孔雀轻轻跳》教学反思
2014/04/20 职场文书
学校安全防火方案
2014/06/07 职场文书
2014年学校领导班子对照检查材料
2014/09/19 职场文书
2015年政风行风工作总结
2015/04/21 职场文书
新年晚会主持词开场白
2015/05/28 职场文书
建国大业观后感800字
2015/06/01 职场文书
世界文化遗产导游词
2019/08/07 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
在js中修改html body的样式
2021/11/11 Javascript