我正在使用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
)
查看上述按键顺序的差异。
答案 0 :(得分:3)
首先sort
array
。
然后通过翻转生成array
,以便key
可以根据value
s分隔。使用键对数组进行排序并将它们合并到数组中。并将键与排序值组合在一起。
$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)
}
答案 1 :(得分:3)
这应该适合你:
首先使用array_walk()
遍历每个数组值,并将每个值更改为包含值和键的数组。
在此之后使用uasort()
对数组进行排序,如果两个值相同,则使用该键选择哪一个应该是第一个。
最后,只需使用array_column()
将数组转换回来。
sphinx-build-dir
输出:
<?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);
?>