Если в 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; });