Php Сортировка массивов - PullRequest
0 голосов
/ 02 декабря 2011

У меня есть ключ => массив значений:

a => 2
c => 1
b => 3

Я пробовал это:

ksort($result);
arsort($result);

Но это не работает.Я пытаюсь отсортировать по алфавиту по ключу az, а затем отсортировать по возрастанию значения 0-бесконечность.

, поэтому я должен получить

c => 1
a => 2
b => 3

Но эти сортировки не дали мне то, что яхотел.

Ответы [ 2 ]

9 голосов
/ 02 декабря 2011

Попробуйте использовать asort() вместо arsort(). arsort() отсортирует массив в обратном порядке. Примерно так должно «работать»:

$test = array(
    'a' => 0,
    'b' => 1,
    'c' => 2
);
ksort($test);
asort($test);

Марио прав, что это не сработает, если несколько элементов содержат одно и то же значение. В качестве альтернативы вы можете использовать uksort (), который позволяет вам точно определить, как сортируется массив. Например, вы можете отсортировать два элемента, используя их значения по умолчанию. Но если значения одинаковы по их ключам.

$test = array(
    'a' => 2,
    'd' => 1,
    'c' => 1,
    'b' => 3
);
function cmp($a, $b){
    global $test;
    $val_a = $test[$a];
    $val_b = $test[$b];

    if($val_a == $val_b){
        return ($a < $b) ? -1 : 1;
    }
    return ($val_a < $val_b) ? -1 : 1;
}
uksort($test, 'cmp');
2 голосов
/ 02 декабря 2011

Я получаю неожиданные результаты, потому что сортировка значений с одинаковым значением нестабильна.

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

c => 1
a => 2
z => 2
b => 3

Для этого в PHP нет функции.Однако вы можете сначала попытаться отсортировать по ключам ksort(), а затем применить пользовательскую функцию для сортировки по значению uasort().В обратном вызове также важно реализовать проверку $a == $b и вернуть 0. Таким образом, предыдущий порядок ключей не может быть случайно изменен состояниями сравнения +1 или -1.(Не знаю, работает ли это на самом деле.)

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

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