按数组值的最后几个字符对数组进行排序?

问题描述 投票:0回答:3

在 PHP 中,如何根据数组值的最后几个字符对数组进行排序?以以下数组为例:

$donuts[0] = "Chocolate 02";
$donuts[1] = "Jelly 16";
$donuts[2] = "Glazed 01";
$donuts[3] = "Frosted 12";

排序后,数组将如下所示(注意基于每个值的最后两个字符的顺序...还要注意重写的索引):

$donuts[0] = "Glazed 01";
$donuts[1] = "Chocolate 02";
$donuts[2] = "Frosted 12";
$donuts[3] = "Jelly 16";

我似乎找不到可以做到这一点的内置函数,并且一直在绞尽脑汁寻找最简单、最有效的方法来完成此任务。帮助!谢谢!

php arrays sorting
3个回答
3
投票

这应该可以解决问题:

header('Content-Type: Text/Plain');
$donuts[0] = "Chocolate 02";
$donuts[1] = "Jelly 16";
$donuts[2] = "Glazed 01";
$donuts[3] = "Frosted 12";

print_r($donuts);

usort($donuts, function ($a, $b){
    return substr($b, -2) - substr($a, -2);
});

print_r($donuts);

注意

  1. 从最高转换为最小:

    return substr($b, -2) - substr($a, -2);
    
  2. 这个答案假设要使用最后 2 个字符。

更新

要使其在 PHP 版本 5.2 上运行,请将

return
部分更改为:

return substr($b, strlen($b) - 2) - substr($a, strlen($a) - 2);

1
投票
usort($donuts, function ($a, $b) {
    preg_match('/\d+$/', $a, $matchA);
    preg_match('/\d+$/', $b, $matchB);
    return $matchA[0] - $matchB[0];
});

这当然会从一些预处理中受益匪浅,因此您不需要一遍又一遍地

preg_match
相同的字符串。


0
投票

由于完成此任务的方法有很多,因此目标应该是最小化函数调用总数。由于需要对每个元素隔离数字后缀,因此每次迭代至少有 1 次函数调用。由于排序算法是非线性的(它们执行的迭代次数会多于 N 个 1),因此您应该努力在线性循环中单独执行隔离步骤,然后进行排序。

代码:(演示

array_multisort(array_map(fn($v) => substr($v, -2), $donuts), $donuts);
var_export($donuts);
© www.soinside.com 2019 - 2024. All rights reserved.