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

yipeiwu_com5年前PHP代码库
从 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缓存技术的多种方法小结

1、普遍缓存技术:   数据缓存:这里所说的数据缓存是指数据库查询PHP缓存机制,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据,并把查询结果序...

php禁止浏览器使用缓存页面的方法

本文实例讲述了php禁止浏览器使用缓存页面的方法。分享给大家供大家参考。具体方法如下: 页面缓存在有的时候是不需要的,我们可以禁止浏览器缓存页面。 在PHP中可以轻松的使用下面的语句实现...

Cakephp 执行主要流程

加载基本文件 cake/basics.php 里面定义了常用的方法以及时间常量 $TIME_START = getMicrotime(); 记录开始执行时间 cake/config/pa...

PHP使用HTML5 FormData对象提交表单操作示例

PHP使用HTML5 FormData对象提交表单操作示例

本文实例讲述了PHP使用HTML5 FormData对象提交表单操作。分享给大家供大家参考,具体如下: 这是HTML5中新增的一个Api,他能以表单对象作为参数,自动的把表单的数据打包,...

php全局变量和类配合使用深刻理解

情况1: father.php如下定义: 复制代码 代码如下: <?php $jack = 1000; ?> children.php 如下定义: <?php requ...