首页 > 解决方案 > PHP数组字母排序以匹配MySQL顺序

问题描述

鉴于我有一个数组

['test', 'te', 'tes', 'z'];

并使用 PHPsort()函数,我得到以下结果

数组( [0] => te [1] => tes [2] => 测试 [3] => z )

但我想要实现的是这个

 ['test', 'tes', 'te',  'z'];

我查看了排序函数的文档,找不到正确的排序标志来实现它。

标签: phpmysqlsorting

解决方案


对列表进行排序,然后构建一个新数组,其中键作为第一个字符,值作为以该字符开头的单词列表。然后对这些单词列表进行反向排序并再次合并数组。

<?php
$items = [
    'foolhardy',
    'foo',
    'foolish',
    'fool',
    'football',
    'footbridge',
    'apple'
];
sort($items);

var_export($items);

foreach($items as $item) {
    $tmp[$item[0]][] = $item;
}

foreach($tmp as &$v) {
    rsort($v);
}

$out = array_merge(...array_values($tmp));
var_export($out);

输出:

array (
  0 => 'apple',
  1 => 'foo',
  2 => 'fool',
  3 => 'foolhardy',
  4 => 'foolish',
  5 => 'football',
  6 => 'footbridge',
)array (
  0 => 'apple',
  1 => 'footbridge',
  2 => 'football',
  3 => 'foolish',
  4 => 'foolhardy',
  5 => 'fool',
  6 => 'foo',
)

或者,您可以使用 usort 和 spaceship 比较运算符来执行此操作。比较项目,如果它们以相同的字母开头反向排序,否则按字母顺序排序:

<?php
usort($items, function($a, $b) {
    return
        $a[0] === $b[0]
        ? $b <=> $a
        : $a <=> $b;
});

推荐阅读