Как отсортировать многомерный массив, если сопоставить то же значение, то зависит от другого ключа в PHP? - PullRequest
0 голосов
/ 26 июня 2018

Я работаю над usort функцией, сейчас у меня есть такой массив

$data = array(
        array('rank'=>8,'suit'=>0),
        array('rank'=>7,'suit'=>3),
        array('rank'=>8,'suit'=>2),
    );

Когда я использую функцию usort, она выглядит так, как показано ниже

usort($data function($a, $b) {
            return $a['rank'] - $b['rank'];
        });

И я получаю результат ниже:

$data = array(
            array('rank'=>7,'suit'=>3),
            array('rank'=>8,'suit'=>0),
            array('rank'=>8,'suit'=>2),
        );

Но я хочу получить результат ниже:

 $data = array(
                array('rank'=>7,'suit'=>3),
                array('rank'=>8,'suit'=>2),
                array('rank'=>8,'suit'=>0),
            );

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

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Вы можете попробовать использовать array_multisort

foreach ($data as $key => $value) {
    $rank[$key] = $value['rank'];
    $suit[$key] = $value['suit'];
}

array_multisort($rank, SORT_ASC, $suit, SORT_DESC, $data);

Или как этот ответ Вы можете использовать

array_multisort(array_column($data, 'rank'), SORT_ASC, array_column($data, 'suit'), SORT_DESC, $data);
0 голосов
/ 26 июня 2018

Все еще используя usort(), это будет сортировать rank в по возрастанию по порядку suit в по убыванию по порядку:

usort($data, function($a, $b) {
    if ($a['rank'] == $b['rank']) {
        if ($a['suit'] == $b['suit']) {
            return 0;
        }
        return $a['suit'] > $b['suit'] ? -1 : 1;
    }
    return $a['rank'] < $b['rank'] ? -1 : 1;
});

Я столкнулся с этой логикой, выполнив это несколько раз, используя PHP 7 оператор космического корабля .
Вот то же решение, использующее этот оператор для сортировки ключа rank:

usort($data, function($a, $b) {
    if ($a['rank'] == $b['rank']) {
        if ($a['suit'] == $b['suit']) {
            return 0;
        }
        return $a['suit'] > $b['suit'] ? -1 : 1;
    }
    return $a['rank'] <=> $b['rank'];
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...