【问题标题】:PHP combining arsort & ksortPHP结合arsort和ksort
【发布时间】:2011-11-28 06:08:46
【问题描述】:

我正在尝试按值降序对数组进行排序,保留键 (arsort),但如果值相等,我希望它也按键升序排序 (ksort)。

我一直在尝试这个:

ksort($array);
arsort($array);

但是ksort没有保留,在arsort之后,keys又乱了。

例如如果我的输入数组在:

$array[0] = 4;
$array[1] = 2;
$array[2] = 3;
$array[3] = 1;
$array[4] = 4;

我想对它进行排序,这样它就结束了:

$array[0] = 4;
$array[4] = 4;
$array[2] = 3;
$array[1] = 2;
$array[3] = 1;

不是这样的:

$array[4] = 4;
$array[0] = 4;
$array[2] = 3;
$array[1] = 2;
$array[3] = 1;

但是之前的按键顺序似乎被arsort打乱了。

【问题讨论】:

标签: php arrays sorting


【解决方案1】:

PHP 在 PHP 4.1 中放弃了稳定排序(这保证了您想要的排序): https://bugs.php.net/bug.php?id=53341&edit=1

这是一个看似愚蠢的问题,使用代码 sn-p 来解决它(基本上:编写自己的排序函数。嘘。): Preserve key order (stable sort) when sorting with PHP's uasort

【讨论】:

    【解决方案2】:

    可惜了,由于不支持,下面是我为它写的一个函数:

    function arksort($array)
        {
        arsort($array);
        $newarray=array();
        $temp=array();
        $on=current($array);
        foreach($array as $key => $val)
            {
            if ($val===$on) $temp[$key]=$val;
            else
                {
                ksort($temp);
                $newarray=$newarray+$temp;
                $temp=array();
                $on=$val;
                $temp[$key]=$val;
                }
            }
        ksort($temp);
        $newarray=$newarray+$temp;
        reset($newarray);
        return $newarray;
        }
    

    【讨论】:

      猜你喜欢
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-06
      相关资源
      最近更新 更多