可能重复:
Preserve key order (stable sort) when sorting with PHP’s uasort
我有一个数组:
$temp = Array('a' => 0, 'b' => 0,'c' => 1,'d' => 1,'e' => 0,'f' => 0,'g' => 2,'h' => 0);
我希望按升序对其值进行排序:
asort($temp);
print_r($temp);
给出:
Array
(
[e] => 0
[a] => 0
[h] => 0
[b] => 0
[f] => 0
[d] => 1
[c] => 1
[g] => 2
)
但我想以某种方式保留具有相同值的条目的结构,例如:
Array
(
[a] => 0
[b] => 0
[e] => 0
[f] => 0
[h] => 0
[c] => 1
[d] => 1
[g] => 2
)
我认为这不是一个“排序”,而是更多的数组函数过滤器/ map / walk,但我看不出任何有效的方法使这项工作。
更多信息: 我需要排序500个值,大约3500次,因此速度和效率至关重要。这些数字将每天增长,因为这个过程将在一夜之间运行。
有什么想法吗? 感谢。
编辑: 我需要保留键和值,因此使用asort。 我只能按值排序,因为会有多个相同值的条目。 我的字母示例中的键更容易解释我的查询,但实际上是数字,不会按时间顺序排列。
答案 0 :(得分:0)
排序值不保留键,排序键不保留值。 如果你有封闭的php 5.3,你可以填充它,但它不是最干净的方式:
uksort($temp,function($a,$b)use($temp){
if($temp[$a] < $temp[$b]){
return -1;
}
if($temp[$a] > $temp[$b]){
return 1;
}
return strcmp($a,$b);
});
答案 1 :(得分:0)
我的解决方案(当然不是最好的解决方案)基于array_multisort()函数:
<?php
$temp = array('a' => 0, 'b' => 0,'c' => 1,'d' => 1,'e' => 0,'f' => 0,'g' => 2,'h' => 0);
$keys = array_keys($temp);
$values = array_values($temp);
array_multisort($values, $keys);
$temp = array_combine($keys, $values);