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 相关文章推荐
PHP4实际应用经验篇(9)
Oct 09 PHP
php miniBB中文乱码问题解决方法
Nov 25 PHP
php session应用实例 登录验证
Mar 16 PHP
关于PHP语言构造器介绍
Jul 08 PHP
mac下Apache + MySql + PHP搭建网站开发环境
Jun 02 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
Jul 01 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
Oct 16 PHP
php使用指定字符列表生成随机字符串的方法
Apr 18 PHP
PHP封装CURL扩展类实例
Jul 28 PHP
php实现的递归提成方案实例
Nov 14 PHP
php+jQuery+Ajax实现点赞效果的方法(附源码下载)
Jul 21 PHP
关于PHP求解三数之和问题详析
Nov 09 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中常用编辑器推荐
2007/01/02 PHP
PHP服务器页面间跳转实现方法
2012/08/02 PHP
浅析PHP 按位与或 (^ 、&)
2013/06/21 PHP
PHP的mysqli_thread_id()函数讲解
2019/01/24 PHP
用jquery来定位
2007/02/20 Javascript
基于jquery的修改当前TAB显示标题的代码
2010/12/11 Javascript
innerHTML,outerHTML,innerText,outerText的用法及区别解析
2013/12/16 Javascript
jQuery遍历Table应用示例
2014/04/09 Javascript
jQuery使用fadein方法实现渐出效果实例
2015/03/27 Javascript
Jquery中基本选择器用法实例详解
2015/05/18 Javascript
JavaScript中数组继承的简单示例
2015/07/29 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
DOM事件阶段以及事件捕获与事件冒泡先后执行顺序(图文详解)
2015/08/18 Javascript
详解JavaScript基于面向对象之继承
2015/12/13 Javascript
微信小程序 共用变量值的实现
2017/07/12 Javascript
python client使用http post 到server端的代码
2013/02/10 Python
Flask实现图片的上传、下载及展示示例代码
2018/08/03 Python
Python面向对象之接口、抽象类与多态详解
2018/08/27 Python
python scatter散点图用循环分类法加图例
2019/03/19 Python
Django中密码的加密、验密、解密操作
2019/12/19 Python
pytorch masked_fill报错的解决
2020/02/18 Python
Python接口自动化判断元素原理解析
2020/02/24 Python
超酷炫 CSS3垂直手风琴菜单
2016/06/28 HTML / CSS
网页布局中CSS样式无效的十个重要原因详解
2017/08/10 HTML / CSS
检测用户浏览器是否支持CSS3的方法
2009/08/29 HTML / CSS
Mybag美国/加拿大:英国奢华包包和名牌手袋网站
2020/02/16 全球购物
大一期末自我鉴定
2013/12/13 职场文书
仓库组长岗位职责
2014/01/29 职场文书
师说教学反思
2014/02/07 职场文书
买卖协议书范本
2014/04/21 职场文书
留学经费担保书
2014/05/12 职场文书
环卫工人节活动总结
2014/08/29 职场文书
乡镇群众路线整改落实情况汇报
2014/10/28 职场文书
质检员岗位职责
2015/02/03 职场文书
2015年人力资源工作总结
2015/04/08 职场文书
党员进社区活动总结
2015/05/07 职场文书