混合数组排序

时间:2013-09-20 18:12:31

标签: php arrays sorting

SO,

问题

我遇到自定义数组排序问题。我有一个数组:

$rgData = [
  3 => 1,
  5 => 0,
  1 => 2,
  9 => 0,
  0 => 1,
  4 => 2,
  2 => 1,
  7 => 0,
  6 => 0,
  8 => 0,
];

-it包含带有计数的键(实际上,它是在使用array_count_values进行一些操作之后)。现在我想对它进行排序:

  • 较低的值首先出现(即可以使用asort()
  • 进行常规升序排序
  • 在一个值中,键应按升序排序(此处需要帮助)

对于以上样本,结果应为:

[5=>0, 6=>0, 7=>0, 8=>0, 9=>0, 0=>1, 2=>1, 3=>1, 1=>2, 4=>2]

我的方法

我不知道如何通过用户定义排序来解决此问题,因为usortuasort仅接受uksort的比较值 - 只有键我需要两个我的比较功能。我现在唯一的方法就是这样做:

$rgData = ['3'=>1, '5'=>0, '1'=>2, '9'=>0, '0'=>1, '4'=>2, '2'=>1, '7'=>0, '6'=>0, '8'=>0];
$rgTemp = [];
asort($rgData);
$i     = 0;
$mPrev = current($rgData);
foreach($rgData as $mKey=>$mValue)
{
        $rgTemp[$mPrev==$mValue?$i:++$i][$mKey] = $mValue;
        $mPrev = $mValue;
}
$rgTemp = array_map(function($rgX)
{
        ksort($rgX);
        return $rgX;
}, $rgTemp);
$rgData = [];
//can't use call_user_func_array('array_merge', $rgTemp) - it spoils numeric keys
foreach($rgTemp as $rgX)
{
        foreach($rgX as $mKey=>$mValue)
        {
                $rgData[$mKey] = $mValue;
        }
}
//var_dump($rgData);

-i.e。首先按值拆分数组,然后执行操作。

问题

如何以更简单的方式做到这一点?我使用asort +循环ksort通过array_map进行最终收集循环。临时阵列也用过。看起来很奇怪。我希望存在更简单的方法。

1 个答案:

答案 0 :(得分:2)

这应该做你想要的。它按键排序,但我们可以访问函数内部的值,因此我们也可以使用它作为我们的排序标准。

uksort($rgData, function($a, $b) use($rgData){
    $aVal = $rgData[$a];
    $bVal = $rgData[$b];

    // Compare the values
    if($aVal === $bVal){
        // If they are the same, compare the keys
        return $a - $b;
    }
    // Otherwise compare the values
    return $aVal - $bVal;
});