按包含逻辑运算符的键对数组进行排序
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);
});
想知道这个问题以前是否已经解决,因为我的 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);
});