所以,
问题
我对自定义数组排序有疑问。我有一个数组:
$rgData = [
3 => 1,
5 => 0,
1 => 2,
9 => 0,
0 => 1,
4 => 2,
2 => 1,
7 => 0,
6 => 0,
8 => 0,
];
- 它包含带有计数的键(实际上,它是在一些操作之后出现的array_count_values
)。现在我想对其进行排序:
- 较低的值首先出现(即通常可以使用的升序排序
asort()
) - 在一个值内,键应该按升序排序(这里我需要帮助)
对于上面的示例,结果应该是:
[5=>0, 6=>0, 7=>0, 8=>0, 9=>0, 0=>1, 2=>1, 3=>1, 1=>2, 4=>2 ]
我的方法
我不知道如何通过用户定义的排序来解决这个问题,usort
或者uasort
只接受比较的值,而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);
- 即首先按值拆分数组,然后执行这些操作。
问题
如何以更简单的方式做到这一点?我使用asort
+ 循环ksort
通过array_map
最终收集循环。临时数组也被使用。看起来很奇怪。我希望存在更简单的方法。