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

时间:2018-02-16 11:28:55

标签: php mysql arrays sorting integer

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

当前输出为:

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

但实际上我需要:

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

4 个答案:

答案 0 :(得分:2)

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

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

ORDER BY CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(`yourfieldname`,' ',-2),' ',1) AS UNSIGNED),`yourfieldname`

上面的子句说:隔离第二个最后一个子串并将其转换为无符号数。这可确保执行“自然排序”(以便12之前不会3)。作为二级排序标准,我使用全字符串来打破关系。

那就是说,如果你的实际字符串并不总是服从那个结构,我接下来会推荐array_multisort(),因为它执行的迭代正则函数调用次数较少。

代码:(Demo

$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

array_multisort(preg_replace('~\D+~','',$array),$array);
var_export($array);

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

以上所有方法都将采用此输入:

$array=[
    'Indica 4 PAX',
    'Indigo/swif Dezire/Etios  11 PAX',
    'Tavera 10 PAX',
    'Innova 10 PAX',
    'Tempo Traveller 9 PAX'
];

并提供此输出:

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',
)

答案 1 :(得分:1)

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

<?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);

输出:

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',
)

答案 2 :(得分:0)

可能你会喜欢这个。

我刚从php manual引用了一个例子。

<?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);
?>

答案 3 :(得分:0)

<?php

$data =
[
    'Catnip 23 units',
    'Cheezy chips 18 units',
    'Refried beans 21 units' 
];

$int_filter = function($str) {
    return filter_var($str, FILTER_SANITIZE_NUMBER_INT);
};
$int_values = array_map($int_filter, $data);
asort($int_values); // Order int_values and maintain keys.

$ordered = array_replace($int_values, $data);
var_export($ordered);

输出:

array (
  1 => 'Cheezy chips 18 units',
  2 => 'Refried beans 21 units',
  0 => 'Catnip 23 units',
)