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

时间:2017-10-03 12:53:03

标签: php sorting multidimensional-array

这是我的第一篇文章,我希望我不犯任何错误。

我有一个合唱成员列表作为数组:

$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. 按字母顺序排序
  3. 使用此代码完成语音排序:

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

    如何在不丢失语音顺序的情况下按姓氏订购数组?

    感谢您的帮助和深思熟虑。

    勒夫

2 个答案:

答案 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;
});

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

答案 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时才会进行名称比较,因此它只能作为平局判断器。