跳转到主内容
极星编程网:以代码为星,赴技术山海!

PHP中usort在值相同时改变原始位置问题的解决方法_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
$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
$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)) http://www.bkjia.com/PHPjc/324740.html www.bkjia.com true http://www.bkjia.com/PHPjc/324740.html TechArticle从 PHP 4.1.0 后,usort 在比较的值相同时,原始位置可能会改变,文档中是这样说的: If two members compare as equal, their order in the sorted array is un...

相关文章