2013-09-20 3 views
2

SO,смешанный массив рода

Проблема

У меня есть проблема с сортировкой пользовательский массив. У меня есть массив:

$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. Это выглядит странно. Надеюсь, существует более простой метод.

ответ

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; 
}); 
+0

Точно так. Грустно иметь ночную работу: p Спасибо. –

+0

Добро пожаловать! :-) –

Смежные вопросы