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 iconv 函数转gb2312的bug解决方法
Oct 11 PHP
php 调用远程url的六种方法小结
Nov 02 PHP
php 高效率写法 推荐
Feb 21 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
Dec 29 PHP
深入php函数file_get_contents超时处理的方法详解
Jun 03 PHP
php验证是否是md5编码的简单代码
Apr 01 PHP
ThinkPHP行为扩展Behavior应用实例详解
Jul 22 PHP
PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
Nov 18 PHP
PHP中使用Imagick操作PSD文件实例
Jan 26 PHP
php+html5使用FormData对象提交表单及上传图片的方法
Feb 11 PHP
Laravel框架实现的使用smtp发送邮件功能示例
Mar 12 PHP
在laravel中实现ORM模型使用第二个数据库设置
Oct 24 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/12/30 PHP
PHP中如何定义和使用常量
2013/02/28 PHP
php中关于socket的系列函数总结
2015/05/18 PHP
学习php设计模式 php实现观察者模式(Observer)
2015/12/09 PHP
WordPress中的shortcode短代码功能使用详解
2016/05/17 PHP
js类后台管理菜单类-MenuSwitch
2007/09/12 Javascript
js substr、substring和slice使用说明小记
2011/09/15 Javascript
一个简单的jquery进度条示例
2014/04/28 Javascript
javascript作用域问题实例分析
2015/07/13 Javascript
20分钟打造属于你的Bootstrap站点
2016/07/27 Javascript
Angular 理解module和injector,即依赖注入
2016/09/07 Javascript
Vue声明式渲染详解
2017/05/17 Javascript
javaScript之split与join的区别(详解)
2017/11/08 Javascript
Vue 组件注册实例详解
2019/02/23 Javascript
在项目vue中使用echarts的操作步骤
2020/09/07 Javascript
[49:20]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
Python中使用HTMLParser解析html实例
2015/02/08 Python
Linux下使用python调用top命令获得CPU利用率
2015/03/10 Python
Python中zfill()方法的使用教程
2015/05/20 Python
python如何以表格形式打印输出的方法示例
2019/06/21 Python
Python读取xlsx文件的实现方法
2019/07/04 Python
Python实现Singleton模式的方式详解
2019/08/08 Python
对Django的restful用法详解(自带的增删改查)
2019/08/28 Python
django Model层常用验证器及自定义验证器详解
2020/07/15 Python
如何让PyQt5中QWebEngineView与JavaScript交互
2020/10/21 Python
Python爬虫简单运用爬取代理IP的实现
2020/12/01 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
CSS Grid布局教程之什么是网格布局
2014/12/30 HTML / CSS
Linux的文件类型
2012/03/07 面试题
市场营销专业毕业生自荐信
2013/11/02 职场文书
2015届大学生就业推荐表自我评价
2014/09/27 职场文书
预备党员考察意见范文
2015/06/01 职场文书
作文之亲情600字
2019/09/23 职场文书
python实现简单倒计时功能
2021/04/21 Python
Python数据结构之队列详解
2022/03/21 Python
golang生成并解析JSON
2022/04/14 Golang