首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何根据元素中的整数值对元素进行排序?

如何根据元素中的整数值对元素进行排序?
EN

Stack Overflow用户
提问于 2018-02-16 19:28:55
回答 4查看 108关注 0票数 0

我需要根据数组元素包含的整数值对其进行排序。

当前输出为:

代码语言:javascript
运行
复制
array[0] -> Indica 4 PAX

array[1] -> Indigo/swif Dezire/Etios  11 PAX

array[2] -> Tavera 8-10 PAX

array[3] -> Innova 10 PAX

array[4] -> Tempo Traveller 7-9 PAX

但实际上我需要的是:

代码语言:javascript
运行
复制
array[0] -> Indica 4 PAX

array[1] -> Tempo Traveller 7-9 PAX

array[2] -> Tavera 8-10 PAX

array[3] -> Innova 10 PAX

array[4] -> Indigo/swif Dezire/Etios  11 PAX
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-02-16 20:03:11

您的问题上有mysql标记,所以我假设您的数据来自结果集行。我还看到您的所有数值都是字符串中倒数第二个非空格的子字符串。

因此,可以使用下面的ORDER BY子句在mysql查询中有效地处理排序过程:(SQLFiddle)

代码语言:javascript
运行
复制
ORDER BY CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(`yourfieldname`,' ',-2),' ',1) AS UNSIGNED),`yourfieldname`

上面的子句说:分离倒数第二个子串,并将其转换为无符号数字。这确保了执行“自然排序”(这样12就不会在3之前出现)。作为第二个排序条件,我使用完整字符串来打破平局。

也就是说,如果您的实际字符串并不总是遵循这种结构,那么我接下来推荐使用array_multisort(),因为它执行的迭代正则表达式函数调用较少。

代码:(Demo)

代码语言:javascript
运行
复制
$order=preg_replace('~\D+~','',$array);  // generates: ['4','11','10','10','9']
array_multisort($order,$array);  // sort $array as $order is sorted
var_export($array);

你甚至可以把它写成一行代码:(Demo)

代码语言:javascript
运行
复制
array_multisort(preg_replace('~\D+~','',$array),$array);
var_export($array);

*用于处理连字符的数字子字符串的模式调整:~-\d+|\D+~这将删除非数字字符和跟在连字符后面的数字。

以上所有方法都将接受此输入:

代码语言:javascript
运行
复制
$array=[
    'Indica 4 PAX',
    'Indigo/swif Dezire/Etios  11 PAX',
    'Tavera 10 PAX',
    'Innova 10 PAX',
    'Tempo Traveller 9 PAX'
];

并提供以下输出:

代码语言:javascript
运行
复制
array (
  0 => 'Indica 4 PAX',
  1 => 'Tempo Traveller 9 PAX',
  2 => 'Innova 10 PAX',
  3 => 'Tavera 10 PAX',
  4 => 'Indigo/swif Dezire/Etios  11 PAX',
)
票数 2
EN

Stack Overflow用户

发布于 2018-02-16 20:42:17

如果您有两个相同的整数,那么最终您可能希望按名称进行子排序。

代码语言:javascript
运行
复制
<?php
$data=[
    'Indica 4 PAX',
    'Indigo/swif Dezire/Etios  11 PAX',
    'Tavera 10 PAX',
    'Innova 10 PAX',
    'Tempo Traveller 9 PAX'
];

$int_filter = function($str) {
    return filter_var($str, FILTER_SANITIZE_NUMBER_INT);
};
$sorter = function($a, $b) use ($int_filter) {
    $cmp = $int_filter($a) <=> $int_filter($b);
    if($cmp === 0)
        $cmp = $a <=> $b;

    return $cmp;
};
uasort($data, $sorter);

var_export($data);

输出:

代码语言:javascript
运行
复制
array (
    0 => 'Indica 4 PAX',
    4 => 'Tempo Traveller 9 PAX',
    3 => 'Innova 10 PAX',
    2 => 'Tavera 10 PAX',
    1 => 'Indigo/swif Dezire/Etios  11 PAX',
)
票数 1
EN

Stack Overflow用户

发布于 2018-02-16 20:00:44

也许你会喜欢用这个。

我刚刚引用了一个来自php manual的例子。

代码语言:javascript
运行
复制
<?php
$arr = [];
$arr[0] = 'Indica 4 PAX';

$arr[1] = 'Indigo/swif Dezire/Etios  11 PAX';

$arr[2] = 'Tavera 10 PAX';

$arr[3] = 'Innova 10 PAX';

$arr[4] = 'Tempo Traveller 9 PAX';
function cmp($a, $b) {
    $a = filter_var($a, FILTER_SANITIZE_NUMBER_INT);
    $b = filter_var($b, FILTER_SANITIZE_NUMBER_INT);
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}
uasort($arr, 'cmp');
var_dump($arr);
?>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48825809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档