[英]PHP: order array with a user-defined comparison function and alphabetically by two values
这是我的第一篇文章,希望我不会犯任何错误。
我有一个合唱团成员列表作为数组:
$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;
});
如何在不失去语音顺序的情况下按姓氏对阵列进行排序?
感谢您的帮助和深思。
约阿希姆
您可以在现有的回调函数中借助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;
});
如果在比较功能中使用$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时才进行名称比较,因此它只能用作平局。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.