【问题标题】:PHP usort in custom orderPHP按自定义顺序排序
【发布时间】:2021-02-26 14:54:58
【问题描述】:

我正在尝试对数组进行排序,比如说:

['qwe',12,'*', 324, '$we'],但我希望它排序:首先是数字,然后是特殊字符和字母。

我知道我必须使用usort(),但不知道如何编写回调函数来实现我需要的。

有什么想法吗?

【问题讨论】:

  • 特别注意手册中的这句话:The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second.因此,您的回调必须说所有数字都小于特殊字符并且小于字母。
  • 任务描述不充分。例如,像“abc1”这样的字符串是如何分类的?分类适用于字符串中的每个字符?

标签: php usort


【解决方案1】:

如果您尝试对数组中的元素进行排序,而不是对元素本身中的字符进行排序,则可以使用以下丑陋但实用的解决方案:

$array = ['qwe',12,'*', 324, '$we'];

$nums = $spec = $letters = array();

foreach ($array as $i) {
    if (is_numeric($i)) {
        array_push($nums, $i); 
    } 
    else if (ctype_alpha($i)) {
        array_push($letters, $i);
    }
    else if (preg_match('/[\'^£$%&*()}{@#~?><>,|=_+¬-]/', $i)) {
        array_push($spec, $i);
    }
}
 
sort($nums);
sort($letters);
sort($spec);

$sorted = array_merge($nums,$spec,$letters);

var_dump($sorted);

这将遍历您的初始数组,并根据其类型(用于检测符号的正则表达式)将每个项目添加到不同的数组中。然后将单个数组按字母顺序排序,并按您喜欢的顺序合并。

上面的代码会输出:

array(5) {
  [0]=>
  int(12)
  [1]=>
  int(324)
  [2]=>
  string(3) "$we"
  [3]=>
  string(1) "*"
  [4]=>
  string(3) "qwe"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2015-05-12
    • 2016-05-24
    • 1970-01-01
    相关资源
    最近更新 更多