手机
当前位置:查字典教程网 >编程开发 >php教程 >PHP中usort在值相同时改变原始位置问题的解决方法
PHP中usort在值相同时改变原始位置问题的解决方法
摘要:从PHP4.1.0后,usort在比较的值相同时,原始位置可能会改变,文档中是这样说的:Iftwomemberscompareasequal...

从 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中usort在值相同时改变原始位置问题的解决方法】相关文章:

PHP4与PHP3中一个不兼容问题的解决方法

PHP Opcache安装和配置方法介绍

php格式化电话号码的方法

PHP和JAVA的XML-RPC中文问题解决办法

PHP session文件独占锁引起阻塞问题解决方法

PHP date函数常用时间处理方法

php实现在服务器端调整图片大小的方法

php采集中国代理服务器网的方法

PHPlet在Windows下的安装

php中smarty区域循环的方法

精品推荐
分类导航