按键顺序增强分类
Enhancing asort by order of keys
我正在使用 asort
对数值数组进行排序。例如
$arr = [0,1,1,2,1,2,2,3];
在 运行 asort
之后我得到:
Array
(
[0] => 0
[4] => 1
[2] => 1
[1] => 1
[6] => 2
[3] => 2
[5] => 2
[7] => 3
)
但我希望按以下顺序获得它:
Array
(
[0] => 0
[1] => 1
[2] => 1
[4] => 1
[3] => 2
[5] => 2
[6] => 2
[7] => 3
)
查看上面按键顺序的不同。
先sort
再array
。
然后通过翻转的方式生成一个array
,使得key
可以按照value
分开。使用键对数组进行排序并将它们合并到一个数组中。并将键与排序后的值组合起来。
$arr = [0,1,1,2,1,2,2,3];
asort($arr);
$sorted = $arr;
$flipped = $new_keys = array();
foreach($arr as $key => $val) {
$flipped[$val][] = $key; // Get the keys
}
foreach($flipped as $key => $val_array) {
asort($val_array); // Sort the keys
$new_keys = array_merge($new_keys, $val_array);
}
$final = array_combine($new_keys, $sorted); // Combine them again
var_dump($final);
输出
array(8) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(1)
[4]=>
int(1)
[3]=>
int(2)
[5]=>
int(2)
[6]=>
int(2)
[7]=>
int(3)
}
这应该适合你:
首先使用 array_walk()
遍历每个数组值,并将每个值更改为包含值和键的数组。
在此之后使用 uasort()
对数组进行排序,如果两个值相同,则使用键选择哪个应该排在第一位。
最后只需使用 array_column()
将数组转换回来。
<?php
$arr = [0,1,1,2,1,2,2,3];
array_walk($arr, function(&$v, $k){
$v = ["value" => $v, "key" => $k];
});
uasort($arr, function($a, $b){
if($a["value"] == $b["value"]) {
if($a["key"] == $b["key"])
return 0;
return $a["key"] > $b["key"] ? 1 : -1;
}
return $a["value"] > $b["value"] ? 1 : -1;
});
$arr = array_column($arr, "value", "key");
print_r($arr);
?>
输出:
Array
(
[0] => 0
[1] => 1
[2] => 1
[4] => 1
[3] => 2
[5] => 2
[6] => 2
[7] => 3
)
我正在使用 asort
对数值数组进行排序。例如
$arr = [0,1,1,2,1,2,2,3];
在 运行 asort
之后我得到:
Array
(
[0] => 0
[4] => 1
[2] => 1
[1] => 1
[6] => 2
[3] => 2
[5] => 2
[7] => 3
)
但我希望按以下顺序获得它:
Array
(
[0] => 0
[1] => 1
[2] => 1
[4] => 1
[3] => 2
[5] => 2
[6] => 2
[7] => 3
)
查看上面按键顺序的不同。
先sort
再array
。
然后通过翻转的方式生成一个array
,使得key
可以按照value
分开。使用键对数组进行排序并将它们合并到一个数组中。并将键与排序后的值组合起来。
$arr = [0,1,1,2,1,2,2,3];
asort($arr);
$sorted = $arr;
$flipped = $new_keys = array();
foreach($arr as $key => $val) {
$flipped[$val][] = $key; // Get the keys
}
foreach($flipped as $key => $val_array) {
asort($val_array); // Sort the keys
$new_keys = array_merge($new_keys, $val_array);
}
$final = array_combine($new_keys, $sorted); // Combine them again
var_dump($final);
输出
array(8) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(1)
[4]=>
int(1)
[3]=>
int(2)
[5]=>
int(2)
[6]=>
int(2)
[7]=>
int(3)
}
这应该适合你:
首先使用 array_walk()
遍历每个数组值,并将每个值更改为包含值和键的数组。
在此之后使用 uasort()
对数组进行排序,如果两个值相同,则使用键选择哪个应该排在第一位。
最后只需使用 array_column()
将数组转换回来。
<?php
$arr = [0,1,1,2,1,2,2,3];
array_walk($arr, function(&$v, $k){
$v = ["value" => $v, "key" => $k];
});
uasort($arr, function($a, $b){
if($a["value"] == $b["value"]) {
if($a["key"] == $b["key"])
return 0;
return $a["key"] > $b["key"] ? 1 : -1;
}
return $a["value"] > $b["value"] ? 1 : -1;
});
$arr = array_column($arr, "value", "key");
print_r($arr);
?>
输出:
Array
(
[0] => 0
[1] => 1
[2] => 1
[4] => 1
[3] => 2
[5] => 2
[6] => 2
[7] => 3
)