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

 更新时间:2011年11月27日 22:21:08   作者:  
从 PHP 4.1.0 后,usort 在比较的值相同时,原始位置可能会改变,如果比较的2个值相同,则它们在排序结果中的顺序是随机的。如果你需要保持相同值的原始位置,可以参考本文的方法。
从 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
)
)

相关文章

  • NOT NULL 和NULL

    NOT NULL 和NULL

    NOT NULL 和NULL...
    2007-01-01
  • php获取客户端IP及URL的方法示例

    php获取客户端IP及URL的方法示例

    这篇文章主要介绍了php获取客户端IP及URL的方法,涉及php预定义服务器变量$_SERVER相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • PHP-Fcgi下PHP的执行时间设置方法

    PHP-Fcgi下PHP的执行时间设置方法

    昨天,一个程序需要导出500条数据,结果发现到150条是,Nginx报出504 Gateway Timeout错误,原来PHP-Fcgi下的设置执行时间与isapi的不同
    2013-08-08
  • 通过缓存数据库结果提高PHP性能的原理介绍

    通过缓存数据库结果提高PHP性能的原理介绍

    众所周知,缓存数据库查询的结果可以显著缩短脚本执行时间,并最大限度地减少数据库服务器上的负载。如果要处理的数据基本上是静态的,则该技术将非常有效。这是因为对远程数据库的许多数据请求最终可以从本地缓存得到满足,从而不必连接到数据库、执行查询以及获取结果
    2012-09-09
  • php 数组元素快速去重

    php 数组元素快速去重

    本篇文章主要介绍了php数组元素快速去重的方法,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-05-05
  • PHP接口多继承及tarits实现多继承效果的方法

    PHP接口多继承及tarits实现多继承效果的方法

    这篇文章主要介绍了PHP接口多继承及tarits实现多继承效果的方法,结合实例形式分析了php基于接口的多继承及PHP5.4中引入的tarits实现多继承功能简单操作技巧,需要的朋友可以参考下
    2018-01-01
  • php环境配置 php5 mysql5 apache2 phpmyadmin安装与配置

    php环境配置 php5 mysql5 apache2 phpmyadmin安装与配置

    php环境配置 php5 mysql5 apache2 phpmyadmin安装与配置...
    2006-11-11
  • mysql5写入和读出乱码解决

    mysql5写入和读出乱码解决

    mysql5写入和读出乱码解决...
    2006-11-11
  • THINKPHP跨域报错的解决方案

    THINKPHP跨域报错的解决方案

    这篇文章主要介绍了THINKPHP跨域报错has been blocked by CORS policy: Response to preflight request doesn't pass access control check的解决方案,文中通过代码示例给大家介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • php开发工具有哪五款

    php开发工具有哪五款

    这篇文章主要为大家介绍了5款php开发工具,为了更好的研究PHP开发,所以搜罗了一下,整理了以下五款开发工具和大家共享。
    2015-11-11

最新评论