嘿伙计们,我正试图用usort反向排序一个多维数组但是在某个地方搞乱了。这是我的代码:
$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) )
)
*/
我做错了什么?
答案 0 :(得分:2)
当你的比较函数rcmp
被调用时,它的参数$a
和$b
是数组,所以你的相等和少于运算符的数组作为它们的操作数。
数组上的相等运算符有效like this:
TRUE if $a and $b have the same key/value pairs.
小于比较的作品like this:
如果在操作数2中找不到操作数1的键,则具有较少成员的数组较小 数组是无法比较的,否则 - 按值比较值。
“无法比较”表示比较评估为null
,这反过来导致rcmp
返回1
。
所以最终发生的事情是$a
和$b
不相同的数组rcmp
always returns 1(即认为$a
更大)。无论每个数组中的键是什么,都会发生这种情况,因此您会得到无意义的排序。
如果您想通过usort
的第一个键对这些数组进行排序,您可以这样做:
function rcmp($a, $b)
{
return key($a) - key($b);
}
答案 1 :(得分:1)
如果要比较数组的索引,必须在比较函数中提取索引并按降序反转比较
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;
}
答案 2 :(得分:0)
这是我提出的使用create_function
的解决方案,尽管接受了最佳答案。谢谢,希望这有助于其他人。
$ array = array(
数组(124 =&gt;'foo'),
数组(123 =&gt;'foo'),//重复
数组(127 =&gt;'foo'),
数组(126 =&gt;'foo'),
数组(123 =&gt;'foo'),//重复
数组(125 =&gt;'foo'),
);
usort($array, create_function('$a, $b','return (key($a) == key($b))
? 0
: (key($a) < key($b))
? -1
: 1;'));
print_r($array);