以下usort函数并不总是给出正确的结果,因为它只会相对于比较项目向上或向下“推”一个位置。因此,当多次执行排序时,结果Yes No Yes No
可能会发生。
该功能成功排序字段b。
我该如何解决这个问题?
阵列
[0] => array("a"=>"Yes","b"=>"apple"...);
[1] => array("a"=>"Yes","b"=>"banana"...);
[2] => array("a"=>"No","b"=>"lemon"...);
[3] => array("a"=>"No","b"=>"grape"...);
...
当前功能
function sortAnserDesc($x, $y){
if ( $x['a'] == $y['a'] )
return 0;
else if ( $x['a'] < $y['a'] )
return 1;
else
return -1;
}
答案 0 :(得分:0)
我在http://www.php.net/manual/en/function.usort.php#103722找到了一个非常好的功能 我认为你有一个普遍的问题。
我尝试在这里显示回调函数。
function usortByArrayKey($key, $asc=SORT_ASC) {
$sort_flags = array(SORT_ASC, SORT_DESC);
if (!in_array($asc, $sort_flags))
throw new InvalidArgumentException('sort flag only accepts SORT_ASC or SORT_DESC');
return function(array $a, array $b) use ($key, $asc, $sort_flags) {
if (!is_array($key)) { //just one key and sort direction
if (!isset($a[$key]) || !isset($b[$key])) {
throw new Exception('attempting to sort on non-existent keys');
}
if ($a[$key] == $b[$key])
return 0;
return ($asc == SORT_ASC xor $a[$key] < $b[$key]) ? 1 : -1;
} else { //using multiple keys for sort and sub-sort
foreach ($key as $sub_key => $sub_asc) {
//array can come as 'sort_key'=>SORT_ASC|SORT_DESC or just 'sort_key', so need to detect which
if (!in_array($sub_asc, $sort_flags)) {
$sub_key = $sub_asc;
$sub_asc = $asc;
}
//just like above, except 'continue' in place of return 0
if (!isset($a[$sub_key]) || !isset($b[$sub_key])) {
throw new Exception('attempting to sort on non-existent keys');
}
if ($a[$sub_key] == $b[$sub_key])
continue;
return ($sub_asc == SORT_ASC xor $a[$sub_key] < $b[$sub_key]) ? 1 : -1;
}
return 0;
}
};
}
要与您的代码集成,您可能会有类似的内容:
仅通过DESCENDING对a
值进行排序。
usort($YOUR_ARRAY, usortByArrayKey('a', SORT_DESC));
对a
和b
进行排序。
usort($YOUR_ARRAY, usortByArrayKey(array('a', 'b')));
有关按DESCENDING
排序a
和b
的详情
usort($YOUR_ARRAY, usortByArrayKey(array('a', 'b')), SORT_DESC);
希望这有帮助!!
答案 1 :(得分:0)
为什么不直接使用strcmp功能?
function sortAnserDesc($x, $y){
return strcmp($x['a'],$y['a']);
}