繁体   English   中英

PHP:具有用户定义比较功能的订单数组,按字母顺序由两个值组成

[英]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)
);

现在,我要按以下顺序订购列表:

  1. 语音顺序:S(opran),A(lt),T(enor),B(ass)
  2. 按姓氏字母顺序排列

语音订购使用以下代码完成:

$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;
});

参考: http : //php.net/manual/zh/function.strcasecmp.php

如果在比较功能中使用$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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM