【问题标题】:Sorting array by keys that include logical operators按包含逻辑运算符的键对数组进行排序
【发布时间】:2019-04-30 21:41:17
【问题描述】:

很好奇这是否已经解决,因为我的 google-fu 似乎找不到这个。我有一个这样的数组:

[
    "<=4/2" => 233
    "16/8" => 73
    ">16/8" => 122
    "8/4" => 21
]

我需要这样排序,以人类可读的升序排列:

[
    "<=4/2" => 233
    "8/4" => 21
    "16/8" => 73
    ">16/8" => 122
]

我知道我可以编写代码来去除逻辑运算符,比较键,然后比较逻辑运算符的位置,按这些键对数组进行排序,等等。

但是有一个我可以使用的功能吗?看来我可能不是第一个这样做的人。

PHP 7.1.x

Laravel 框架

【问题讨论】:

  • 当然你是第一个这样做的人,写你的代码,有问题就来这里。
  • 您想订购这些日期吗?

标签: php arrays laravel php-7.1


【解决方案1】:

没有神奇的函数可以通过忽略这些运算符进行排序。

由于您已经使用 Laravel,您可以将数组转换为集合并使用sortBy 方法通过自定义算法对数组进行排序。

$collection = collect([
    '<=4/2' => 233,
    '16/8' => 73,
    '>16/8' => 122,
    '8/4' => 21,
]);
$sorted = $collection->sortBy(function ($value, $key) {
    return preg_replace('/\D/', '', $key);
});

或者如果你想使用纯 PHP,你可以使用uksort

$array = [
    '<=4/2' => 233,
    '16/8' => 73,
    '>16/8' => 122,
    '8/4' => 21,
];

uksort($array, function ($a, $b) {
    return preg_replace('/\D/', '', $a) > preg_replace('/\D/', '', $b);
});

【讨论】:

    【解决方案2】:

    假设这些键是以 d/M 格式表示日期的字符串,您可以这样做:

    function keyOrder($key) {
        if ($key[0] === "<") return -1;
        if ($key[0] === ">") return 10000;
        list($day, $month) = explode("/", $key);
        return $month*100+$day;
    }
    
    uksort($data, function($a, $b) { return keyOrder($a) - keyOrder($b); } );
    

    【讨论】:

      猜你喜欢
      • 2011-07-23
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 2019-04-26
      • 2017-07-28
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      相关资源
      最近更新 更多