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 小心urldecode引发的SQL注入漏洞
Oct 27 PHP
第六章 php目录与文件操作
Dec 30 PHP
探讨fckeditor在Php中的配置详解
Jun 08 PHP
getJSON跨域SyntaxError问题分析
Aug 07 PHP
php支付宝在线支付接口开发教程
Sep 19 PHP
老生常谈PHP面向对象之注册表模式
May 26 PHP
PHP手机号中间四位用星号*代替显示的实例
Jun 02 PHP
PHP的mysqli_ssl_set()函数讲解
Jan 23 PHP
PHP数组array类常见操作示例
May 15 PHP
php生成短网址/短链接原理和用法实例分析
May 29 PHP
PHPstorm启用自动换行的方法详解(IDE)
Sep 17 PHP
详解PHP设计模式之依赖注入模式
May 25 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
德生PL330的评价与改造
2021/03/02 无线电
PHP 使用memcached简单示例分享
2015/03/05 PHP
详解PHP中的null合并运算符
2015/12/30 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
jQuery select控制插件
2009/08/17 Javascript
IE8 中使用加速器(Activities)
2010/05/14 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之三
2012/01/03 Javascript
解决Extjs4中form表单提交后无法进入success函数问题
2013/11/26 Javascript
javascript通过className来获取元素的简单示例代码
2014/01/10 Javascript
JavaScript原型链示例分享
2014/01/26 Javascript
JavaScript中的索引数组、关联数组和静态数组、动态数组讲解
2014/11/08 Javascript
JS表的模拟方法
2015/02/05 Javascript
jQuery随机密码生成的方法
2015/03/09 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
简单了解JavaScript操作XPath的一些基本方法
2016/06/03 Javascript
使用vue框架 Ajax获取数据列表并用BootStrap显示出来
2017/04/24 Javascript
iscroll-probe实现下拉刷新和下拉加载效果
2017/06/28 Javascript
JS使用tofixed与round处理数据四舍五入的区别
2017/10/25 Javascript
form表单数据封装成json格式并提交给服务器的实现方法
2017/12/14 Javascript
react 实现页面代码分割、按需加载的方法
2018/04/03 Javascript
工作中常用到的ES6语法
2018/09/04 Javascript
jQuery实现计算器功能
2020/10/19 jQuery
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
浅析Python中的多进程与多线程的使用
2015/04/07 Python
tensorflow实现softma识别MNIST
2018/03/12 Python
python 扩展print打印文件路径和当前时间信息的实例代码
2019/10/11 Python
基于Python pyecharts实现多种图例代码解析
2020/08/10 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
2021/01/28 Python
HTML5 body设置自适应全屏
2020/05/07 HTML / CSS
Looking4Parking美国:全球排名第一的机场停车比较品牌
2019/08/26 全球购物
俄语地区最大的中国商品在线购物网站之一:Umka Mall
2019/11/03 全球购物
介绍一下HTTP、HTTPS和SSL
2012/12/16 面试题
自荐信需注意事项
2014/01/25 职场文书
户外活动总结范文
2014/04/30 职场文书
二婚主持词
2015/06/30 职场文书
mysql数据库隔离级别详解
2022/06/16 MySQL