многосортный ассоциативный массив в PHP

Рассмотрим следующий ассоциативный массив

$arr = Array
(        
    [banana] => 2
    [cherry] => 1
    [orange] => 3
    [grapefruit] => 1
    [apple] => 1
)

Я хочу отсортировать его таким образом, чтобы он был похож на терм PLSQL: A DESC, B ASC (где A — значение, а B — ключ) значение:

$arr = Array
(
    [orange] => 3
    [banana] => 2
    [apple] => 1
    [cherry] => 1
    [grapefruit] => 1        
)

так что апельсин и банан идут первыми из-за ЦЕННОСТИ, но затем у меня есть яблоко, вишня и грейпфрут в алфавитном порядке, потому что они имеют одно и то же ЦЕННОСТЬ.

Что я пробовал:
1. запустить ksort(), а затем asort()/ rsort(), надеясь, что вторая сортировка будет поднимите апельсин и банан в начало массива, не нарушая алфавитный порядок остальных 3 элементов. Я был неправ. это все портит. Итак, я проверил:
2. функции сортировкии array_multisort(). Но судя по всему он сортирует сразу несколько массивов, или многомерный массив.
3. Я также попытался определить следующую функцию сравнения:

function cmp($a, $b)
{
    foreach ($a as $key1 => $val1) {
        foreach ($b as $key2 => $val2) {
            if($val1 == $val2){
                return strcmp($key1,$key2);
            }
            else if ($val1 > $val2){
                return 1;
            }
            else{ // $val1 < $val2
                return -1;
            }
        }
    }    
} 

и вызвать ее с помощью usort(), но это тоже не сработало.

Итак, мой вопрос: существует ли метод PHP, реализующий запрошенное поведение?

От Евгения:
Пробовал, не работает до сортировки:

Array
(
    [lamb] => 3
    [rule] => 1
    [children] => 1
    [teacher] => 2
    [eager] => 1
)

и после сортировки:

Array
(
    [children] => 1
    [eager] => 1
    [rule] => 1
    [teacher] => 2
    [lamb] => 3
)

12
задан alfasin 30 May 2014 в 23:55
поделиться