Доступ к массиву ключей с использованием uasort в PHP

Если в PHP есть довольно базовая функция uasort которая выглядит так:

 uasort($arr, function($a, $b) { if ($a > $b) return -1; if ($a < $b) return 1; ... } 

Массив, который я пытаюсь сортировать, выглядит следующим образом:

 {[1642] => 1, [9314] => 4, [1634] => 3 ...} 

Он содержит целые числа, которые являются моими основными критериями сравнения. Однако, если целые числа равны, то я хотел бы получить доступ к их ключевым значениям, внутри функции uasort и сделать с ними некоторую магию, чтобы выяснить сортировку оттуда.

Я не знаю, как это сделать, поскольку кажется, что переменные $a и $b которые передаются в функцию, представляют собой целые числа без соответствующих ключей, но также должен быть способ доступа к ключу, так как я использую функция для фактического сохранения ключей. Есть идеи?

 uksort($arr, function ($a, $b) use ($arr) { return $arr[$a] - $arr[$b] ?: $a - $b; }); 

Вы можете получить значения с помощью ключей, поэтому используйте uksort который дает вам ключи. Замените $a - $b соответствующей магией, вот только сортировка по значению ключа.

Директива по use (в решении deceze) не работает в моей старой установке PHP 5.3.1, в то время как это обеспечит результат:

 $arr=array('1642'=>1,'9314'=>2,'1634'=>1,'1633'=>5,'1636'=>7,'1610'=>1); print_r($arr); function mycmp($a, $b) { if ($a > $b) return -1; if ($a < $b) return 1; else return 0; } function mysrt($arr){ foreach ($arr as $k => $v) $new[$k]="$v $k"; uasort($new, 'mycmp'); $ret=array(); foreach ($new as $k => $v) $ret[$k]=$arr[$k]; return $ret; } print_r(mysrt($arr)); 

mysrt() не сортирует 'in-place', но возвращает отсортированный массив. И, конечно же, моя «магия» при сортировке ключей довольно простая. Ключи сортируются так же, как и значения. Модифицируя оператор $new[$k]="$v $k"; вы можете изменить поведение в соответствии с вашими потребностями.

в качестве примечания …

Решение deceze будет работать на моем сервере только тогда, когда я использую use(&$arr) вместо use($arr) :

 uksort($arr, function ($a, $b) use(&$arr) { return $arr[$a] - $arr[$b] ? $arr[$a] - $arr[$b] : $a - $b; });