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
PHP4 与 MySQL 数据库操作函数详解
Dec 06 PHP
PHP stristr() 函数(不区分大小写的字符串查找)
Jun 03 PHP
php异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE  eval()'d code error
May 19 PHP
php对图像的各种处理函数代码小结
Jul 08 PHP
php读取excel文件示例分享(更新修改excel)
Feb 27 PHP
php目录遍历函数opendir用法实例
Nov 20 PHP
php实现mysql事务处理的方法
Dec 25 PHP
常见PHP数据库解决方案分析介绍
Sep 24 PHP
php实现爬取和分析知乎用户数据
Jan 26 PHP
Yii框架实现多数据库配置和操作的方法
May 25 PHP
Ajax中的JSON格式与php传输过程全面解析
Nov 14 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中通过Ajax如何实现异步文件上传的代码实例
2011/05/07 PHP
php实现文件下载(支持中文文名)
2013/12/04 PHP
php事件驱动化设计详解
2016/11/10 PHP
thinkphp5引入公共部分header、footer的方法详解
2018/09/14 PHP
javascript 去字符串空格终极版(支持utf8)
2009/11/14 Javascript
左右悬浮可分组的网站QQ在线客服代码(可谓经典)
2012/12/21 Javascript
jquery自定义属性(类型/属性值)
2013/05/21 Javascript
jquery中prop()方法和attr()方法的区别浅析
2013/09/06 Javascript
jQuery固定浮动侧边栏实现思路及代码
2014/09/28 Javascript
JavaScript实现N皇后问题算法谜题解答
2014/12/29 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
2014/12/29 Javascript
JavaScript中this详解
2015/09/01 Javascript
JS实现图片高亮展示效果实例
2015/11/24 Javascript
canvas实现图片根据滑块放大缩小效果
2017/02/24 Javascript
详解JavaScript数组过滤相同元素的5种方法
2017/05/23 Javascript
JavaScript高阶函数_动力节点Java学院整理
2017/06/28 Javascript
深入理解node.js http模块
2018/01/24 Javascript
一百行JS代码实现一个校验工具
2019/04/30 Javascript
详解Django通用视图中的函数包装
2015/07/21 Python
Python基于动态规划算法计算单词距离
2015/07/25 Python
Python3 Random模块代码详解
2017/12/04 Python
Python用于学习重要算法的模块pygorithm实例浅析
2018/08/16 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
2018/12/05 Python
python 修改本地网络配置的方法
2019/08/14 Python
基于python 将列表作为参数传入函数时的测试与理解
2020/06/05 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
美国第一香水网站:Perfume.com
2017/01/23 全球购物
海滩咖啡馆:Beach Cafe
2018/02/02 全球购物
MAC彩妆英国官网:M·A·C UK
2018/05/30 全球购物
俞敏洪北大演讲稿
2014/05/22 职场文书
人事任命书怎么写
2014/06/05 职场文书
文员试用期转正自我鉴定
2014/09/14 职场文书
2014超市收银员工作总结
2014/11/13 职场文书
英文自荐信范文
2015/03/25 职场文书
国庆节主题班会
2015/08/15 职场文书
pycharm安装深度学习pytorch的d2l包失败问题解决
2022/03/25 Python