【问题标题】:How to sort elements based on integer value in elements?如何根据元素中的整数值对元素进行排序?
【发布时间】:2018-07-27 07:20:34
【问题描述】:

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

当前输出为:

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

【问题讨论】:

  • 我需要根据数组中整数值的升序排序来打印这个数组
  • Raghu,通常你会展示一些你已经尝试过的代码以及你的问题和预期的输入和输出。
  • 这些数字总是整数吗?
  • 如果两个不同的元素包含相同的数值,应该按什么顺序来?
  • 哇,问题参数已更改。现在你想按整数范围排序。

标签: php mysql arrays sorting integer


【解决方案1】:

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

因此,您的排序过程可以在 mysql 查询中使用ORDER BY 子句进行有效处理:(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',
)

【讨论】:

  • 我喜欢 SELECT ORDER 方法。但据我了解,数字关系会导致与您的其他解决方案略有不同的顺序。 (Innova 10 PAX 之后是 Tavera 10 PAX,这是我个人想要的。)。
  • 我最好重新检查我的方法。 Innova 应该在 Tavera 之前。
  • OP 的示例不能保证这一点,但这可能是一个疏忽。
  • @Progrock 原来我唯一让决胜局出错的方法是使用太空飞船运算符的usort() 方法。 (我只是没有准确地发布我的答案)当它是平局时,“没有运动”,所以它像输入一样保持混乱。 AlivetoDie 的回答没有显示这个错误,但那是纯粹的运气。默认情况下,他的方法在平局上交换。如果输入顺序颠倒,他的答案将不服从字母排序。我删除了我的usort() 调用,因为它在每次迭代/比较时都会调用两次preg_match(),所以它不会很有效。
  • (我敢说我喜欢 preg_replace / array_multisort,虽然你确实松开了钥匙。)
【解决方案2】:

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

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

【讨论】:

  • 为什么要提交两个单独的答案?您可以将它们合并到一篇文章中。和我一样。
  • 不同的方法。
  • 我提供了 3 种不同的方法。
  • 为什么要保留索引? OP 不希望这样。
  • OP 声明他们想要打印数组。索引可能无关紧要,但如果在网络表单中使用结果,他们可能需要它们。如果不需要索引,请使用usort 而不是uasort。或者他们可以随时在结果上调用array_values
【解决方案3】:
<?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',
)

【讨论】:

    【解决方案4】:

    也许你会喜欢用这个。

    我只是引用了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);
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 2018-10-12
      相关资源
      最近更新 更多