PHP结合了arsort& ksort

时间:2011-11-28 06:08:46

标签: php arrays sorting

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

我一直在尝试这个:

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

但是没有保留ksort,并且arsort之后钥匙再次混乱。

E.g。如果我的输入数组在:

$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的干扰。

2 个答案:

答案 0 :(得分:1)

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

这是一个看似愚蠢的问题,带有代码片段,可以解决它(基本上:编写自己的排序函数。嘘。): Preserve key order (stable sort) when sorting with PHP's uasort

答案 1 :(得分:0)

这很可惜,因为它不受支持,这是我为它写的一个函数:

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;
    }