我有以下数组,我试图按分数排序,然后匹配,然后是名称,但我的方法不起作用。谁能明白为什么?
最终顺序应该是 4、3、5。
我使用的usort
是在底部。
[3] => Array
(
[name] => DrayTek Vigor 2130Vn VoIP/WiFi Router
[matches] => Array
(
[0] => voip
)
[score] => 3
)
[4] => Array
(
[name] => DrayTek Vigor 2750n VDSL Wireless Router
[matches] => Array
(
[0] => 2750
)
[score] => 3
)
[5] => Array
(
[name] => DrayTek Vigor 2850Vn VDSL/ADSL VoIP Router
[matches] => Array
(
[0] => voip
)
[score] => 3
)
逻辑
1. all have the same score, so no change in order
2. 4 has 2750 in matches[0] which assuming numbers come before letters, moves 4 up
** the order now should be 4,3,5
3. as 3 and 5 have the same matches[], no change in order
4. 3's name naturally comes before 5 but since its already above, no change
** final order should be 4,3,5
排序结果,最高分优先,然后匹配数组,然后是名称
function cmp($a, $b)
{
if ( $a['score'] < $b['score'] )
return 1;
elseif ( $a['score'] > $b['score'] )
return -1;
elseif ( ! array_diff( $a['matches'], $b['matches'] ) )
return 1;
elseif ( ! array_diff( $b['matches'], $a['matches'] ) )
return -1;
elseif ( ($c = strnatcmp( strtolower($a['name']), strtolower($b['name']) ) ) !== 0 )
return $c;
else
return 0;
}
usort( $this->results['rows'], "cmp" );