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

前端之家收集整理的这篇文章主要介绍了PHP中usort在值相同时改变原始位置问题的解决方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

PHP 4.1.0 后,usort 在比较的值相同时,原始位置可能会改变,文档中是这样说的:
If two members compare as equal,their order in the sorted array is undefined.
也就是说,如果比较的2个值相同,则它们在排序结果中的顺序是随机的。如果你需要保持相同值的原始位置,可以参考本文的方法
演示数据:
<div class="codetitle"><a style="CURSOR: pointer" data="9196" class="copybut" id="copybut9196" onclick="doCopy('code9196')"> 代码如下:

<div class="codebody" id="code9196">
<?PHP
/
解决 PHP 中 usort 在值相同时改变原始位置的问题
作者:Artlover http://www.CodeBit.cn
/
$arr = array(
array('a' => 5,'b' => 3),
array('a' => 5,'b' => 1),'b' => 4),'b' => 2),
);
?>

数组中第一个元素的值是相同的,期望的结果是保持现有的位置不变,即 b 的顺序为 3,1,4,2
用 usort 排序,当比较字段的值相同时,原始顺序可能会改变
<div class="codetitle"><a style="CURSOR: pointer" data="910" class="copybut" id="copybut910" onclick="doCopy('code910')"> 代码如下:
<div class="codebody" id="code910">
<?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);
?>

结果:
<div class="codetitle"><a style="CURSOR: pointer" data="78883" class="copybut" id="copybut78883" onclick="doCopy('code78883')"> 代码如下:
<div class="codebody" id="code78883">
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 :
<div class="codetitle"><a style="CURSOR: pointer" data="18404" class="copybut" id="copybut18404" onclick="doCopy('code18404')"> 代码如下:
<div class="codebody" id="code18404">
<?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,$arr);
?>

结果:
<div class="codetitle"><a style="CURSOR: pointer" data="99842" class="copybut" id="copybut99842" onclick="doCopy('code99842')"> 代码如下:<div class="codebody" id="code99842">
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
)
)

原文链接:https://www.f2er.com/php/27484.html
usort

猜你在找的PHP相关文章