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实现读取和编写XML DOM代码
Apr 07 PHP
PHP多个版本的分析解释
Jul 21 PHP
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
Mar 06 PHP
解析PHP中一些可能会被忽略的问题
Jun 21 PHP
奉献出一个封装的curl函数 便于调用(抓数据专用)
Jul 22 PHP
php图片缩放实现方法
Feb 20 PHP
ThinkPHP令牌验证实例
Jun 18 PHP
PHP中的闭包(匿名函数)浅析
Feb 07 PHP
PHP实现CSV文件的导入和导出类
Mar 24 PHP
php观察者模式应用场景实例详解
Feb 03 PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 PHP
ThinkPHP5框架缓存查询操作分析
May 30 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(1)
2006/10/09 PHP
php array_map()数组函数使用说明
2011/07/12 PHP
Symfony2学习笔记之控制器用法详解
2016/03/17 PHP
获取焦点时,利用js定时器设定时间执行动作
2010/04/02 Javascript
VS2008中使用JavaScript调用WebServices
2014/12/18 Javascript
javascript中for/in循环及使用技巧
2015/09/01 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
2016/02/16 Javascript
使用伪命名空间封装保护独自创建的对象方法
2016/08/04 Javascript
Vue.js第二天学习笔记(vue-router)
2016/12/01 Javascript
教你5分钟学会用requirejs(必看篇)
2017/07/25 Javascript
基于js中this和event 的区别(详解)
2017/10/24 Javascript
浅谈Vue SPA 首屏加载优化实践
2017/12/15 Javascript
Vue表单及表单绑定方法
2018/09/04 Javascript
JavaScript Tab菜单实现过程解析
2020/05/13 Javascript
javascript实现移动端触屏拖拽功能
2020/07/29 Javascript
使用OpenCV实现仿射变换—缩放功能
2019/08/29 Python
python+selenium 脚本实现每天自动登记的思路详解
2020/03/11 Python
python 日志模块 日志等级设置失效的解决方案
2020/05/26 Python
html5 postMessage解决跨域、跨窗口消息传递方案
2016/12/20 HTML / CSS
使用phonegap操作数据库的实现方法
2017/03/31 HTML / CSS
联想加拿大官方网站:Lenovo Canada
2018/04/05 全球购物
什么是表空间(tablespace)和系统表空间(System tablespace)
2013/02/25 面试题
董事长秘书工作职责
2014/06/10 职场文书
空气环保标语
2014/06/12 职场文书
2014年幼儿园个人工作总结
2014/11/10 职场文书
2015年学校关工委工作总结
2015/04/03 职场文书
2015年语文教研组工作总结
2015/05/23 职场文书
贫民窟的百万富翁观后感
2015/06/09 职场文书
环保证明
2015/06/23 职场文书
高中开学感言
2015/08/01 职场文书
被委托人身份证明
2015/08/07 职场文书
人事行政部各岗位职责说明书!
2019/07/15 职场文书
MySQL命令行操作时的编码问题详解
2021/04/14 MySQL
无线电知识基础入门篇
2022/02/18 无线电
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫
星际争霸:毕姥爷vs解冻01
2022/04/01 星际争霸