我有以下数组,我试图按比分排序,然后匹配,然后名称,但我的方法不工作。任何人都能看到为什么按子数组排序多维数组
最终顺序应该是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");
我不明白你试图用火柴数组排序该怎么办... –
@马克 - 我想组“匹配”阵列在一起。由于3和5都具有相同的分数并与数组匹配,因此它们应该一个接一个出现,但它们之间用4分隔。 – Christian
仍然没有得到它。 2750为什么击败voip? –