PHP中usort在值相同时改变原始位置问题的解决方法


Posted in PHP onNovember 27, 2011

从 PHP 4.1.0 后,usort 在比较的值相同时,原始位置可能会改变,文档中是这样说的:
If two members compare as equal, their order in the sorted array is undefined.
也就是说,如果比较的2个值相同,则它们在排序结果中的顺序是随机的。如果你需要保持相同值的原始位置,可以参考本文的方法。
演示数据:

<?php 
/* 
解决 PHP 中 usort 在值相同时改变原始位置的问题 
作者:Artlover http://www.CodeBit.cn 
*/ 
$arr = array( 
array('a' => 5, 'b' => 3), 
array('a' => 5, 'b' => 1), 
array('a' => 5, 'b' => 4), 
array('a' => 5, 'b' => 2), 
); 
?>

数组中第一个元素的值是相同的,期望的结果是保持现有的位置不变,即 b 的顺序为 3,1,4,2
用 usort 排序,当比较字段的值相同时,原始顺序可能会改变
<?php 
/* 
解决 PHP 中 usort 在值相同时改变原始位置的问题 
作者:Artlover http://www.CodeBit.cn 
*/ 
$callback = create_function('$a,$b', 'return ($a["a"] == $b["a"])?0:(($a["a"] > $b["a"]) ? 1 : -1);'); 
usort($arr, $callback); 
?>

结果:
Array 
( 
[0] => Array 
( 
[a] => 5 
[b] => 2 
) 
[1] => Array 
( 
[a] => 5 
[b] => 4 
) 
[2] => Array 
( 
[a] => 5 
[b] => 1 
) 
[3] => Array 
( 
[a] => 5 
[b] => 3 
) 
)

虽然排序字段的值相同,但是 usort 却将整个数组的顺序打乱了。
如果要在比较的值相同时保持原始位置,可以用 array_multisort :
<?php 
/* 
解决 PHP 中 usort 在值相同时改变原始位置的问题 
作者:Artlover http://www.CodeBit.cn 
*/ 
// 索引计数器 
$i = 0; 
// 创建2个空数组,第一个保存要排序的字段,第二个保存原始索引信息 
$a = $index = array(); 
foreach ($arr as $key => $data) { 
$a[$key] = $data['a']; 
$index[] = $i++; 
} 
// 第一个数组先排,接着按原始索引排 
array_multisort($a, SORT_ASC, $index, SORT_ASC, $arr); 
?>

结果:
Array 
( 
[0] => Array 
( 
[a] => 5 
[b] => 3 
) 
[1] => Array 
( 
[a] => 5 
[b] => 1 
) 
[2] => Array 
( 
[a] => 5 
[b] => 4 
) 
[3] => Array 
( 
[a] => 5 
[b] => 2 
) 
)
PHP 相关文章推荐
PHP中的cookie
Nov 26 PHP
一个简单的PHP投票程序源码
Mar 11 PHP
php在程序中将网页生成word文档并提供下载的代码
Oct 09 PHP
使用session判断用户登录用户权限(超简单)
Jun 08 PHP
phpstrom使用xdebug配置方法
Dec 17 PHP
yii框架通过控制台命令创建定时任务示例
Apr 30 PHP
php实现粘贴截图并完成上传功能
May 17 PHP
PHP实现中文圆形印章特效
Jun 19 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
Jan 16 PHP
PDO::getAttribute讲解
Jan 28 PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
May 25 PHP
PHP7.0连接DB操作实例分析【基于mysqli】
Sep 26 PHP
PHP中strtotime函数使用方法详解
Nov 27 #PHP
遍历指定目录下的所有目录和文件的php代码
Nov 27 #PHP
用PHP写的基于Memcache的Queue实现代码
Nov 27 #PHP
PHP中去除换行解决办法小结(PHP_EOL)
Nov 27 #PHP
php操作SVN版本服务器类代码
Nov 27 #PHP
支持中文的php加密解密类代码
Nov 27 #PHP
php UBB 解析实现代码
Nov 27 #PHP
You might like
第十节--抽象方法和抽象类
2006/11/16 PHP
FleaPHP的安全设置方法
2008/09/15 PHP
PHP中防止直接访问或查看或下载config.php文件的方法
2012/07/07 PHP
ThinkPHP CURD方法之page方法详解
2014/06/18 PHP
Yii实现多按钮保存与提交的方法
2014/12/03 PHP
33种Javascript 表格排序控件收集
2009/12/03 Javascript
获得Javascript对象属性个数的示例代码
2013/11/21 Javascript
javascript获取xml节点的最大值(实现代码)
2013/12/11 Javascript
使用JavaScript实现连续滚动字幕效果的方法
2015/07/07 Javascript
Bootstrap页面布局基础知识全面解析
2016/06/13 Javascript
jQuery实现百度登录框的动态切换效果
2017/04/21 jQuery
JS实现搜索关键词的智能提示功能
2017/07/07 Javascript
vue v-model实现自定义样式多选与单选功能
2018/07/05 Javascript
JS实现将二维数组转为json格式字符串操作示例
2018/07/12 Javascript
js中split()方法得到的数组长度问题
2018/07/19 Javascript
NodeJS模块与ES6模块系统语法及注意点详解
2019/01/04 NodeJs
vue-cli 为项目设置别名的方法
2019/10/15 Javascript
[48:32]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python Socket编程入门教程
2014/07/11 Python
python技能之数据导出excel的实例代码
2017/08/11 Python
Python实现针对含中文字符串的截取功能示例
2017/09/22 Python
用python简单实现mysql数据同步到ElasticSearch的教程
2018/05/30 Python
Python日志模块logging基本用法分析
2018/08/23 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
2019/11/15 Python
python 创建一维的0向量实例
2019/12/02 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
2020/04/22 Python
购买一个高级域名:BuyDomains
2018/03/11 全球购物
印尼第一大家居、生活和家具电子商务:Ruparupa
2019/11/25 全球购物
英国在线定做百叶窗网站:Make My Blinds
2020/08/17 全球购物
在C语言中实现抽象数据类型什么方法最好
2014/06/26 面试题
大学生就业求职信
2014/06/12 职场文书
农业局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
领导个人查摆剖析材料
2014/10/29 职场文书
MySQL系列之三 基础篇
2021/07/02 MySQL