这是我的第一篇文章,我希望我不犯任何错误。
我有一个合唱成员列表作为数组:
$members = Array (
[0] => Array (
[0] => Bert
[1] => T
[1] => Array (
[0] => Claudia
[1] => S
[2] => Array (
[0] => Alfred
[1] => T
[3] => Array (
[0] => Kevin
[1] => B
[4] => Array (
[0] => Antonia
[1] => S
[5] => Array (
[0] => Jessica
[1] => A)
);
现在我想订购如下列表:
使用此代码完成语音排序:
$order = array('S','A','T','B');
uasort($members, function ($a, $b) use ($order) {
$pos_a = array_search($a[1], $order);
$pos_b = array_search($b[1], $order);
return $pos_a - $pos_b;
});
如何在不丢失语音顺序的情况下按姓氏订购数组?
感谢您的帮助和深思熟虑。
勒夫
答案 0 :(得分:0)
您可以在现有回调函数的strcasecmp()
的帮助下实现这一目标:
uasort($members, function ($a, $b) use ($order) {
$pos_a = array_search($a[1], $order);
$pos_b = array_search($b[1], $order);
if($pos_a == $pos_b) { // Same voice : check the name instead to order both items
return strcasecmp($a[0],$b[0]);
}
return $pos_a - $pos_b;
});
答案 1 :(得分:0)
如果在比较函数中使用$order
数组之前将其翻转,则可以避免多个array_search
调用。在那之后,只需按正确的顺序应用排序标准。
$order = array_flip($order);
uasort($members, function($a, $b) use ($order) {
return $order[$a[1]] - $order[$b[1]] ?: strcasecmp($a[0], $b[0]);
});
语音顺序以这种方式保留,因为只有在语音比较返回0时才会进行名称比较,因此它只能作为平局判断器。