Проблема
У меня есть проблема с сортировкой пользовательский массив. У меня есть массив:
$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);
-i.e. сначала разделите массив на значения, а затем сделайте это.
Вопрос
Как сделать это в более простой способ? Я использовал asort
+ циклический ksort
через array_map
с окончательным циклом сбора. Также используется массив Temp. Это выглядит странно. Надеюсь, существует более простой метод.
Точно так. Грустно иметь ночную работу: p Спасибо. –
Добро пожаловать! :-) –