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常用代码
Nov 23 PHP
smarty+adodb+部分自定义类的php开发模式
Dec 31 PHP
如何用phpmyadmin设置mysql数据库用户的权限
Jan 09 PHP
使用php判断网页是否gzip压缩
Jun 25 PHP
PHP中redis的用法深入解析
Feb 20 PHP
php数组排序usort、uksort与sort函数用法
Nov 17 PHP
thinkphp模板赋值与替换实例简述
Nov 24 PHP
php创建多级目录的方法
Mar 24 PHP
PHP文件操作详解
Dec 30 PHP
php实现基于PDO的预处理示例
Mar 28 PHP
PHP截取发动短信内容的方法
Jul 04 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
Oct 22 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
drupal 代码实现URL重写
2011/05/04 PHP
Ajax实时验证用户名/邮箱等是否已经存在的代码打包
2011/12/01 PHP
PHP中__get()和__set()的用法实例详解
2013/06/04 PHP
php使用Imagick生成图片的方法
2015/07/31 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
2016/03/22 PHP
如何实现动态删除javascript函数
2007/05/27 Javascript
javascript不同页面传值的改进版
2008/09/30 Javascript
简单的js分页脚本
2009/05/21 Javascript
Javascript绝句欣赏 一些经典的js代码
2012/02/22 Javascript
jquery等宽输出文字插件使用介绍
2013/09/18 Javascript
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
2014/12/18 NodeJs
wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析
2015/05/06 Javascript
微信小程序 location API接口详解及实例代码
2016/10/12 Javascript
Linux CentOS系统下安装node.js与express的方法
2017/04/01 Javascript
深入理解AngularJs-scope的脏检查(一)
2017/06/19 Javascript
微信小程序实现单选功能
2018/10/30 Javascript
通过javascript实现段落的收缩与展开
2019/06/26 Javascript
基于layui table返回的值的多级嵌套的解决方法
2019/09/19 Javascript
vue项目中js-cookie的使用存储token操作
2020/11/13 Javascript
Python返回真假值(True or False)小技巧
2015/04/10 Python
Python3访问并下载网页内容的方法
2015/07/28 Python
pytorch 自定义参数不更新方式
2020/01/06 Python
Python连接字符串过程详解
2020/01/06 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
2020/01/19 Python
Python无损压缩图片的示例代码
2020/08/06 Python
Pytorch1.5.1版本安装的方法步骤
2020/12/31 Python
CSS3 Flex 弹性布局实例代码详解
2018/11/01 HTML / CSS
美国修容界大佬创建的个人美妆品牌:Kevyn Aucoin Beauty
2018/12/12 全球购物
经典c++面试题二
2015/08/14 面试题
小学生手册家长评语
2014/04/16 职场文书
保洁公司服务承诺书
2014/05/28 职场文书
药剂专业毕业生求职信
2014/06/24 职场文书
三分钟自我介绍演讲稿
2014/08/21 职场文书
2014年政务公开工作总结
2014/12/09 职场文书
使用python创建股票的时间序列可视化分析
2022/03/03 Python
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android