按包含逻辑运算符的键对数组进行排序

Sorting array by keys that include logical operators

想知道这个问题以前是否已经解决,因为我的 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
]

我知道我可以编写代码来剥离逻辑运算符,比较键,然后比较逻辑运算符应该落在何处,按这些键对数组进行排序,等等。

但是有没有我可以直接使用的功能?看来我不是第一个这样做的

PHP7.1.x

Laravel 框架

假设这些键是以 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); } );

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

因为您已经使用了 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);
});