从 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 ) )
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|