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+Html+缓存
Dec 20 PHP
JpGraph php柱状图使用介绍
Aug 23 PHP
php对图像的各种处理函数代码小结
Jul 08 PHP
Windows和Linux中php代码调试工具Xdebug的安装与配置详解
May 08 PHP
php中 $$str 中 &quot;$$&quot; 的详解
Jul 06 PHP
php邮箱地址正则表达式验证
Nov 13 PHP
PHP类和对象相关系统函数与运算符小结
Sep 28 PHP
php获取客户端IP及URL的方法示例
Feb 03 PHP
PHP缓存工具XCache安装与使用方法详解
Apr 09 PHP
微信公众平台开发教程⑥ 微信开发集成类的使用图文详解
Apr 10 PHP
PHP单例模式实例分析【防继承,防克隆操作】
May 22 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
Jun 05 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
实例(Smarty+FCKeditor新闻系统)
2007/01/02 PHP
php模块memcache和memcached区别分析
2011/06/14 PHP
PHP的foreach中使用引用时需要注意的一个问题和解决方法
2014/05/29 PHP
zend framework框架中url大小写问题解决方法
2014/08/19 PHP
在Yii2特定页面如何禁用调试工具栏Debug Toolbar详解
2017/08/07 PHP
PHP字符串与数组处理函数用法小结
2020/01/07 PHP
PHP code 验证码生成类定义和简单使用示例
2020/05/27 PHP
Javascript中Eval函数的使用说明
2008/10/11 Javascript
javascript返回顶部效果(自写代码)
2013/01/06 Javascript
浅析Cookie中的Path与domain
2013/12/18 Javascript
js动态调用css属性的小规律及实例说明
2013/12/28 Javascript
jquery插件hiAlert实现网页对话框美化
2015/05/03 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
2016/02/17 Javascript
基于React.js实现原生js拖拽效果引发的思考
2016/03/30 Javascript
vue实现全选和反选功能
2017/08/31 Javascript
Koa项目搭建过程详细记录
2018/04/12 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
2018/04/17 jQuery
基于vue2.0的活动倒计时组件countdown(附源码下载)
2018/10/09 Javascript
使用express获取微信小程序二维码小记
2019/05/21 Javascript
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
python抓取网页图片并放到指定文件夹
2014/04/24 Python
python动态网页批量爬取
2016/02/14 Python
python实现简单购物商城
2016/05/21 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
2018/09/02 Python
对python:print打印时加u的含义详解
2018/12/15 Python
Django项目主urls导入应用中views的红线问题解决
2019/08/10 Python
使用python自动追踪你的快递(物流推送邮箱)
2020/03/17 Python
Css3实现无缝滚动防抖
2020/09/14 HTML / CSS
Photobook澳大利亚:制作相片书,婚礼卡,旅行相簿
2017/01/12 全球购物
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
台湾演唱会订票网站:StubHub台湾
2019/06/11 全球购物
置业顾问岗位职责
2014/03/02 职场文书
生物技术专业求职信
2014/06/10 职场文书
法院干警四风问题自我剖析材料
2014/09/29 职场文书
初中生散播谣言检讨书
2014/11/17 职场文书
vue实现同时设置多个倒计时
2021/05/20 Vue.js