PHP многомерный массив сортировать по значению - PullRequest
1 голос
/ 01 апреля 2019

Относительно этого многомерного массива:

[
(int) 7 => [
    (int) 0 => [
        (int) 0 => '12:45',
        (int) 1 => 'E1',
        (int) 2 => 'B EXTREME 30'
    ],
    (int) 1 => [
        (int) 0 => '10:15',
        (int) 1 => 'E1',
        (int) 2 => 'B SHAPE 30'
    ],
],
(int) 1 => [
    (int) 0 => [
        (int) 0 => '09:30',
        (int) 1 => 'E2',
        (int) 2 => 'CYCLING VIRTUAL 50'
    ],
    (int) 1 => [
        (int) 0 => '10:30',
        (int) 1 => 'E1',
        (int) 2 => 'BODY PUMP VIRTUAL 60'
    ],
    (int) 2 => [
        (int) 0 => '11:45',
        (int) 1 => 'E1',
        (int) 2 => 'BODY BALANCE VIRTUAL 60'
    ],
],
(int) 2 => [
    (int) 0 => [
        (int) 0 => '14:45',
        (int) 1 => 'E2',
        (int) 2 => 'CYCLING VIRTUAL 50'
    ],
    (int) 1 => [
        (int) 0 => '17:00',
        (int) 1 => 'E1',
        (int) 2 => 'POSTURA ALONGAMENTO 60'
    ],
    (int) 2 => [
        (int) 0 => '09:15',
        (int) 1 => 'E1',
        (int) 2 => 'BODY PUMP 50'
    ],
]
]

Первым ключом каждого массива первого уровня являются дни недели (день 7, день 1 и день 2).

Массивы внутри каждого массива первого уровня содержат часы (09:45), комнаты (E1) и описание (B EXTREME 30).

Я попытался отсортировать этот многомерный массив по значению часа массива второго уровня.Я использовал usort(), ksort(), array_multisort() и некоторые пользовательские функции для сортировки массива без необходимости.

Внутренние массивы должны быть отсортированы в порядке возрастания, например так (пример сдень 2):

09:15 -> 14:45 -> 17:00

Кто-нибудь знает, как мне этого добиться?

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Предположим, ваши данные называются $data.Выполните итерацию внешнего массива и примените сортировку к каждому массиву среднего уровня, основываясь на временной части (в самых внутренних массивах).Поскольку ваше время всегда форматируется как "чч: сс", сравнение строк в обратном вызове usort делает работу:

foreach ($data as &$events) {
    usort($events, function($a, $b) {
        return strcmp($a[0], $b[0]);
    });
}

Обратите внимание на & в foreach: это гарантирует, что выСортируйте исходные данные, а не их копию.

Если вы хотите создать новый массив, скажем, $result, то сделайте это (нет & здесь!):

foreach ($data as $day => $events) {
    usort($events, function($a, $b) {
        return strcmp($a[0], $b[0]);
    });
    $result[$day] = $events;
}
0 голосов
/ 01 апреля 2019

usort - Сортировать массив по значениям, используя пользовательскую функцию сравнения. Давайте создадим функцию, в которой мы сравним время двух событий.

Это часть вашего массива

$array = [
    2 => [
        0 => [
            0 => '14:45',
            1 => 'E2',
            2 => 'CYCLING VIRTUAL 50'
        ],
        1 => [
            0 => '17:00',
            1 => 'E1',
            2 => 'BODY PUMP VIRTUAL 60'
        ],
        2 => [
            0 => '09:15',
            1 => 'E1',
            2 => 'BODY BALANCE VIRTUAL 60'
        ],
    ],
];

Это пример того, как сортировать товары за один день (день 2)

usort($array[2], function ($a, $b) {
    $time_a = strtotime($a[0]); // convert string to a unix timestamp to compare int
    $time_b = strtotime($b[0]);
    return $time_a - $time_b;
});

Вывод с использованием print_r($array);

Array
(
    [2] => Array
        (
            [0] => Array
                (
                    [0] => 09:15
                    [1] => E1
                    [2] => BODY BALANCE VIRTUAL 60
                )

            [1] => Array
                (
                    [0] => 14:45
                    [1] => E2
                    [2] => CYCLING VIRTUAL 50
                )

            [2] => Array
                (
                    [0] => 17:00
                    [1] => E1
                    [2] => BODY PUMP VIRTUAL 60
                )

        )

)

Для сортировки всех дней мы делаем цикл, передавая массив каждого дня в качестве ссылки, используя &:

foreach ($array as &$day) {
    usort($day, function ($a, $b) {
        $time_a = strtotime($a[0]);
        $time_b = strtotime($b[0]);
        return $time_a - $time_b;
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...