PHP Как отсортировать ассоциативный массив сначала по ключам, а затем по значениям? - PullRequest
3 голосов
/ 21 марта 2011
$arr =array(
    28 => 23,
    26 => 23,
    15 => 12,
    29 => 12,
    1 => 12,
    16 => 15,
    30 => 15,
    11 => 12,
    8 => 23,
    33 => 23
);

как сортировать так:

8 => 23
26 => 23
28 => 23
33 => 23
16 => 15
30 => 15
1 => 12
11 => 12
15 => 12
29 => 12

Ответы [ 3 ]

5 голосов
/ 21 марта 2011

Используйте uksort , но сделайте массив доступным для функции сравнения для вторичного сравнения по значению. Сделать ее глобальной переменной было бы самым быстрым и самым грязным способом.

4 голосов
/ 21 марта 2011

Вы можете использовать uksort(), что позволяет настраиваемому обратному вызову взглянуть как на ключи, так и косвенно на связанные с ними значения. Тогда нужно просто решить, какие сравнения сделать, и вернуть соответствующее значение больше, чем меньше, чем ноль, чтобы повлиять на порядок сортировки.

Вот пример использования замыкания вокруг временной переменной (см. комментарий Джейкоба ), который, как мы надеемся, имеет смысл.

$temp = $arr;
uksort($arr, function ($a,$b) use ($temp) {
    // Same values, sort by key ascending
    if ($temp[$a] === $temp[$b]) {
        return $a - $b;
    }
    // Different values, sort by value descending
    return $temp[$b] - $temp[$a];
});
unset($temp);
print_r($arr);
0 голосов
/ 21 марта 2011

Это довольно просто.Сначала используйте ksort , а затем используйте asort для нового отсортированного массива.Вы найдете свой результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...