【问题标题】:Order PHP array values ascending, but preserve same value order structure [duplicate]将PHP数组值按升序排列,但保留相同的值顺序结构[重复]
【发布时间】:2026-01-05 17:10:01
【问题描述】:

可能重复:
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
    )

我认为这与其说是“排序”,不如说是数组函数 filter/map/walk,但我看不出任何有效的方法来完成这项工作。

更多信息: 我需要对多达 500 个值进行排序,大约 3500 次,因此速度和效率至关重要。这些数字每天都会增长,因为该过程将在一夜之间运行。

有什么想法吗? 谢谢。

编辑: 我需要保留键和值,因此需要使用 asort。 我只能按值排序,因为会有多个具有相同值的条目。 我的字母示例中的键更容易解释我的查询,但实际上是数字,不会按时间顺序排列。

【问题讨论】:

  • php.net/manual/en/function.uksort.php#109413 此用户说明提供了一个功能。我相信您可以将其修改为从低到高。
  • 感谢艾伦,该链接和后续条目可能很有用。
  • 这不是完全重复的,因为我想在对值进行排序后保持具有相同值(非键)的条目的相对位置。
  • 无论如何,请在此处查看:*.com/questions/4353739/… 以获得答案。

标签: php arrays sorting filter


【解决方案1】:

排序值不会保留键,排序键不会保留值。 如果你有带有闭包的 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);
  });          

【讨论】:

    【解决方案2】:

    我的解决方案(当然不是最好的)基于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);
    

    【讨论】: