【问题标题】:How to sort an array with PHP, ignoring the (Mr, Mrs) or Some articles如何使用 PHP 对数组进行排序,忽略 (Mr, Mrs) 或 Some 文章
【发布时间】:2016-05-17 13:50:13
【问题描述】:

使用名称对数组进行排序 我有一个数组。

 array(0 => Mr. Bala ,1 => Mr. Santhosh, 2 => Mrs. Camel,3 => Mrs. Vinoth); 

仅根据名称升序排序

我的预期输出是

array(
  0 => Mr. Bala,
  1 => Mrs. Camel,
  2 => Mr. Santhosh,
  3 => Mr. Vinoth,
);

【问题讨论】:

  • 您想使用usort,您可以在其中定义自己的比较函数。

标签: php arrays sorting


【解决方案1】:

使用 usort,取字符串的第二部分,按点分割,后面有空格

usort($a, function($i1, $i2) {
        return strcmp(explode('. ',$i1)[1], explode('. ',$i2)[1]);
      });

UPD 由于 Bart Friederichs 的评论

usort($a, function($i1, $i2) {
            $t = explode('. ',$i1);
            $i1 = (! isset($t[1]) ? $i1 : $t[1]);
            $t = explode('. ',$i2);
            $i2 = (! isset($t[1]) ? $i2 : $t[1]);
            return strcmp($i1, $i2);
          });

demo

UPD2 使其不区分大小写

usort($a, function($i1, $i2) {
            $t = explode('. ',$i1);
            $i1 = (! isset($t[1]) ? $i1 : $t[1]);
            $t = explode('. ',$i2);
            $i2 = (! isset($t[1]) ? $i2 : $t[1]);
            return strcmp(strtoupper($i1), strtoupper($i2));
          });

【讨论】:

  • 如果没有Mr.Mrs.怎么办?
  • 我已经通过@BartFriederichs 评论更新了答案并添加了演示链接
  • @KarthiM 当然,任何大写字母 eval.in/572590。你想要大小写无关的条件吗?
  • @splash58 在名称场景中运行良好。如果我有一整封没有 (.) 的字母,那你的情况可能是错误的。该场景应满足任何类型的用户输入。 eval.in/572605
  • 恐怕对于通用解决方案将需要更多代码,包括支持从右到左书写字母的语言
【解决方案2】:

只是我自己的想法,应该更灵活一点。 Working Demo

usort($data, 'sortByName');

function sortByName($a, $b) {
    $remove = [' ', '.', 'Mrs', 'Miss', 'Ms', 'Master', 'Dr', 'Mr'];

    $a = str_replace($remove, '', $a);
    $b = str_replace($remove, '', $b);  

    return strcasecmp($a, $b);
}

唯一需要注意的是$titles 需要按特定顺序排列,因为Mrs 必须始终位于Mr 之前,因为MrMrs 之内,因此如果您切换顺序,那么Mr可能会被带走留下流氓S

相信这应该可以满足您的需求,如有任何问题,请告诉我。

编辑已更新。

【讨论】:

  • @KarthiM 我相信这对你有用,如果你有更多的标题可以附加到数组上。
  • @KarthiM Theresult 是基于名称的吗?注意名称是按顺序排列的A > Avinshon > B > B > C > F > Jo.O
  • offcourse 优先级 1 - 剩下的名字是下一个优先级
  • @KarthiM 不确定你的意思。它只显示字母的唯一原因是因为这是我放入的测试数据集,以便于区分它是否有序。您可以将任何数据数组传递给usort(); Working Demo 将使用您的数据集进行更新。
【解决方案3】:

这是另一种方法,但这次使用正则表达式。 如果没有“。”也可以使用。在先生或夫人之后

$arrToSort = ["Mr. Bala","Mr. Santhosh","Camel","Mrs. Vinoth","Mr Roger","Mr. Calmator","Janette","Mrs Anne Couture"];
usort($arrToSort, 'ignore_Title');

function ignore_Title($a, $b){
    preg_match("/^Mrs{0,1}\.{0,1} (.*)$|/s",$a,$tmp);
    preg_match("/^Mrs{0,1}\.{0,1} (.*)$|/s",$b,$tmp2);
    return strcasecmp($tmp[1],($tmp2[1] == "" ?  $b : $tmp2[1]));
}
print_r($arrToSort);

输出:

[0] => Mr. Bala
[1] => Camel
[2] => Mr. Calmator
[3] => Janette
[4] => Mrs Lark Obm
[5] => Mr Roger
[6] => Mr. Santhosh
[7] => Mrs. Vinoth

【讨论】:

  • {0,1} 等价于?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
  • 1970-01-01
  • 2012-04-06
相关资源
最近更新 更多