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
php下通过POST还是GET来传值
Jun 05 PHP
php学习之简单计算器实现代码
Jun 09 PHP
关于PHP session 存储方式的详细介绍
Jun 25 PHP
php如何解决无法上传大于8M的文件问题
Mar 10 PHP
教你如何用php实现LOL数据远程获取
Jun 10 PHP
php文件操作之小型留言本实例
Jun 20 PHP
PHP实现上传文件并存进数据库的方法
Jul 16 PHP
php基于dom实现的图书xml格式数据示例
Feb 03 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
Feb 08 PHP
PHP反射机制原理与用法详解
Feb 15 PHP
php生出随机字符串
Jul 06 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数组交集的优化代码分析
2011/03/06 PHP
Php中文件下载功能实现超详细流程分析
2012/06/13 PHP
PHP实现在线阅读PDF文件的方法
2015/06/17 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
2019/07/24 PHP
对YUI扩展的Gird组件 Part-1
2007/03/10 Javascript
HTML Dom与Css控制方法
2010/10/25 Javascript
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
2011/02/26 Javascript
jQuery 源码分析笔记(2) 变量列表
2011/05/28 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
JavaScript实现点击单选按钮改变输入框中文本域内容的方法
2015/08/12 Javascript
实例讲解jquery中mouseleave和mouseout的区别
2016/02/17 Javascript
jQuery查看选中对象HTML代码的方法
2016/06/17 Javascript
三种方式实现瀑布流布局
2017/02/10 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
2017/04/04 jQuery
node.js调用Chrome浏览器打开链接地址的方法
2017/05/17 Javascript
JS实现数组去重方法总结(六种方法)
2017/07/14 Javascript
剖析Angular Component的源码示例
2018/03/23 Javascript
Vue组件通信$attrs、$listeners实现原理解析
2020/09/03 Javascript
Vue项目开发常见问题和解决方案总结
2020/09/11 Javascript
Python实现的选择排序算法示例
2017/11/29 Python
python游戏地图最短路径求解
2019/01/16 Python
Python3列表内置方法大全及示例代码小结
2019/05/10 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
简单了解为什么python函数后有多个括号
2019/12/19 Python
python中resample函数实现重采样和降采样代码
2020/02/25 Python
Python实现初始化不同的变量类型为空值
2020/06/02 Python
细说NumPy数组的四种乘法的使用
2020/12/18 Python
世界上最大的艺术社区:SAA
2020/12/30 全球购物
入党申请书自我鉴定
2013/10/12 职场文书
教室布置标语
2014/06/26 职场文书
董事长年会致辞
2015/07/29 职场文书
《伯牙绝弦》教学反思
2016/02/16 职场文书
PostgreSQL将数据加载到buffer cache中操作方法
2021/04/16 PostgreSQL
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
2021/06/29 Javascript
php双向队列实例讲解
2021/11/17 PHP
英镑符号 £
2022/02/17 杂记