嘿,伙计们,我正试图用ussort对多维数组进行反向排序,但我在某处搞砸了。下面是我的代码:
$array = array(
array(123 => 'foo'), // duplicate
array(124 => 'foo'),
array(127 => 'foo'),
array(126 => 'foo'),
array(123 => 'foo'), // duplicate
array(125 => 'foo'),
);
function rcmp($a, $b) {
if($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
usort($array, 'rcmp');
print_r($array);
/*
Array
(
[0] => Array ( [126] => foo) )
[1] => Array ( [125] => foo) )
[2] => Array ( [127] => foo) )
[3] => Array ( [123] => foo) )
[4] => Array ( [124] => foo) )
[5] => Array ( [123] => foo) )
)
*/
我在等
/*
Array
(
[0] => Array ( [127] => foo) )
[1] => Array ( [126] => foo) )
[2] => Array ( [125] => foo) )
[3] => Array ( [124] => foo) )
[4] => Array ( [123] => foo) )
[5] => Array ( [123] => foo) )
)
*/
我做错了什么?
如果要比较数组的索引,必须在比较函数中提取索引并按降序进行反向比较
function rcmp($a, $b) {
$a = array_keys($a);
$b = array_keys($b);
if($a[0] == $b[0]) {
return 0;
}
return ($a[0] < $b[0]) ? 1 : -1;
}
当您的比较函数rcmp
被调用时,它的参数$a
和$b
是数组,因此您的相等和小于操作符将数组作为其操作数。
数组上的相等操作符是这样的:
TRUE if $a and $b have the same key/value pairs.
成员数少的数组越小,如果操作数1中的键在操作数2中没有找到,则数组越小数组不可比较,否则-逐个值比较。
"Uncomparable"是指比较结果为null
,这反过来又导致rcmp
返回1
。
所以最终发生的是,当$a
和$b
不是相同的数组时,rcmp
总是返回1(即认为$a
更大)。无论每个数组中的键是什么,都会发生这种情况,结果是得到一个无意义的排序。
如果你想用usort
按数组的第一个键排序,你可以这样做:
function rcmp($a, $b)
{
return key($a) - key($b);
}
这是我想到的一个使用create_function
的解决方案,尽管接受最好的答案。谢谢,希望这能帮助到其他人。$array = array(数组(124 => 'foo'),数组(123 => 'foo'),//重复数组(127 => 'foo'),数组(126 => 'foo'),数组(123 => 'foo'),//重复数组(125 => 'foo'),
usort($array, create_function('$a, $b','return (key($a) == key($b))
? 0
: (key($a) < key($b))
? -1
: 1;'));
print_r($array);