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 相关文章推荐
用来解析.htpasswd文件的PHP类
Sep 05 PHP
对于PHP 5.4 你必须要知道的
Aug 07 PHP
php获取新浪微博数据API实例
Nov 12 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
Apr 10 PHP
5款适合PHP使用的HTML编辑器推荐
Jul 03 PHP
php获取本机真实IP地址实例代码
Mar 31 PHP
PHP实现的文件操作类及文件下载功能示例
Dec 24 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 PHP
php微信公众号开发之秒杀
Oct 20 PHP
php如何计算两坐标点之间的距离
Dec 29 PHP
php给数组赋值的实例方法
Sep 26 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
Oct 17 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面试题集锦
2012/03/08 PHP
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
2012/09/23 PHP
JS 实现Table相同行的单元格自动合并示例代码
2013/08/27 Javascript
document.write的几点使用心得
2014/05/14 Javascript
js动态添加的DIV中的onclick事件简单实例
2016/07/25 Javascript
总结javascript中的六种迭代器
2016/08/16 Javascript
react.js 翻页插件实例代码
2017/01/19 Javascript
BootStrap 动态表单效果
2017/06/02 Javascript
React 子组件向父组件传值的方法
2017/07/24 Javascript
详解基于Vue-cli搭建的项目如何和后台交互
2018/06/29 Javascript
从vue源码看props的用法
2019/01/09 Javascript
vue-cli 关闭热更新操作
2020/09/18 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
Python os模块中的isfile()和isdir()函数均返回false问题解决方法
2015/02/04 Python
Python中关于Sequence切片的下标问题详解
2017/06/15 Python
python字典操作实例详解
2017/11/16 Python
神经网络相关之基础概念的讲解
2018/12/29 Python
python 根据时间来生成唯一的字符串方法
2019/01/14 Python
Python中如何导入类示例详解
2019/04/17 Python
Python List列表对象内置方法实例详解
2019/10/22 Python
详解django使用include无法跳转的解决方法
2020/03/19 Python
Django框架获取form表单数据方式总结
2020/04/22 Python
CSS3制作轮播图的一种方法
2019/11/11 HTML / CSS
探讨HTML5移动开发的几大特性(必看)
2015/12/30 HTML / CSS
英国最大的运动营养公司之一:LA Muscle
2018/07/02 全球购物
在weblogic中发布ejb需涉及到哪些配置文件
2012/01/17 面试题
大学生军训广播稿
2014/01/24 职场文书
科技节口号
2014/06/19 职场文书
重点工程汇报材料
2014/08/27 职场文书
高中班主任评语
2014/12/30 职场文书
2015年公路养护工作总结
2015/05/13 职场文书
2015年小学总务工作总结
2015/07/21 职场文书
2015年度工程师评职称工作总结
2015/10/14 职场文书
咖啡厅里的创业计划书
2019/08/21 职场文书
Python机器学习算法之决策树算法的实现与优缺点
2021/05/13 Python
python tkinter Entry控件的焦点移动操作
2021/05/22 Python