Я пытаюсь отсортировать значение многомерного массива на основе согласованного ключа. Мой массив выглядит примерно так, и ключ, по которому я хочу отсортировать значения по порядку, - discipline_one.

$data = [
    [
        'id' => 1,
        'score' => 200,
        'results' => [
            'discipline_one' => "4:01"
        ],
    ],
    [
        'id' => 2,
        'score' => 250,
        'results' => [
            'discipline_one' => "3:50"
        ],
    ],
    [
        'id' => 3,
        'score' => 284,
        'results' => [
            'discipline_one' => "3:42"
        ],
    ],
    [
        'id' => 4,
        'score' => 300,
        'results' => [
            'discipline_one' => "4:27"
        ],
    ],
];

Если в приведенном выше примере отпустить клавишу id, я ожидаю, что результат будет в следующем порядке:

3, 2, 1, 4

Раньше для запроса на основе score я использовал:

array_multisort(array_column($data, 'score'), SORT_DESC, $data);

Однако, если я добавлю сюда еще array_column для согласованного ключа discipline_one, тогда Я получил:

array_multisort(array_column(array_column($data, 'result'), 'discipline_one'), SORT_DESC, $data);

array_multisort (): размеры массивов несовместимы

Третий аргумент ожидает такой же массив, что в данном случае невозможно. Кто-нибудь знает, как я могу этого добиться?

-1
Jaquarh 27 Ноя 2021 в 12:12
В вашем массиве есть столбец 'results', а в вашем коде есть 'result' для извлечения столбца.
 – 
Nigel Ren
27 Ноя 2021 в 12:18
Это правда, я перенес это из моих реальных данных в более ограниченную среду для SO, поэтому я допустил опечатку. Метод по-прежнему вызывает проблему и не работает, поэтому нет, эта проблема все еще воспроизводима и была вызвана не только опечаткой. @NigelRen
 – 
Jaquarh
27 Ноя 2021 в 12:27
Я только что попробовал код с «результатами» и получил ожидаемый порядок - 4, 1, 2, 3.
 – 
Nigel Ren
27 Ноя 2021 в 12:32
Попробуйте принятый ответ с теми же значениями! Вы сравниваете строки, а не время.
 – 
Nigel Ren
27 Ноя 2021 в 12:36

1 ответ

Лучший ответ

Почему бы не использовать простой usort?

usort($data, fn($a, $b) => ($a['results']['discipline_one'] <=> $b['results']['discipline_one']) * -1);
2
Justinas 27 Ноя 2021 в 12:20
Спасибо за быстрый ответ. Я очень ценю это, я не видел <=>, прежде чем обязательно займусь этим! Я приму этот ответ, как только мне будет время.
 – 
Jaquarh
27 Ноя 2021 в 12:20
Это spaceship operator, но вы можете вернуть любое число меньше 0 , 0 или больше 0 в любой функции сортировки.
 – 
Justinas
27 Ноя 2021 в 12:21
При тестировании больших данных я также вижу, что проблема в том, что это строка из-за :, поэтому сравнение очень странное при работе с 1:55 и 11:55. Он показывает 11:55 перед 1:55, поэтому для этого я удалю : и конвертирую в целое число перед проверкой.
 – 
Jaquarh
27 Ноя 2021 в 12:33
Если поменять местами раунды $ a и $ b, можно избежать использования * -1
 – 
Nigel Ren
27 Ноя 2021 в 12:37