首页 > 解决方案 > 具有高优先级的具体值的用户排序

问题描述

我正在尝试实现一个函数,该函数将按词汇顺序(不区分大小写)对字符串数组进行排序。但有一个例外:如果字符串等于,让我们说“宾果!” 把这条线放在上面。

我做了一些在给定的测试数据上运行良好的函数。但我不确定我不会用特殊情况欺骗自己。请检查我。

<?php

$a = [
    'alfa', 
    'beta',
    'gama',
    'sigma',
    'foo',
    'bar',
    'bingo!',
];

usort($a, function ($a, $b) {
    $cmp = strcasecmp($a, $b);
    return $cmp == 0
    ? 0
    : (strcasecmp($a, 'bingo!') == 0
            ? -1000
            : (
            strcasecmp($b, 'bingo!') == 0
            ? 1000
            : $cmp
            )
    );
});

var_export($a);

标签: phpsorting

解决方案


使用 usort 的解决方案:

$onTop = 'bingo!';

$array = [
   'alfa', 
   'beta',
   'gama',
   'sigma',
   'foo',
   'bar',
   'bingo!',   
];

usort($array,function($a,$b) use($onTop){
  $r = ($b == $onTop) <=> ($a == $onTop);
  return $r==0 ? strnatcasecmp($a,$b) : $r;
});

var_export($array);

结果:

array (
  0 => "bingo!",
  1 => "alfa",
  2 => "bar",
  3 => "beta",
  4 => "foo",
  5 => "gama",
  6 => "sigma",
)

推荐阅读