Как отсортировать трехмерный массив по элементу, содержащему дату, от самого нового до самого старого - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть трехмерный массив, структура которого выглядит следующим образом. Давайте назовем самые внутренние массивы как записи для ясности. Мне нужно отсортировать самый внешний массив таким образом, чтобы он сортировался от самого нового к самому старому.

Array (
[0] => Array (
        [0] => Array (
                         [personNum] => 2
                         [type] => comment
                         [datetime] => 2019-05-15 11:29:45
                     ),
        [1] => Array (
                         [personNum] => 3
                         [type] => status
                         [datetime] => 2019-05-26 15:59:53
                     )
       ),

[1] => Array (
        [0] => Array (
                         [personNum] => 3
                         [type] => status
                         [datetime] => 2019-05-26 15:59:53
                     )
        [1] => Array (
                         [personNum] => 4
                         [type] => status
                         [datetime] => 2019-05-26 16:04:24
                     )
      )
)

Я проверил это и это ссылки, и я знаю, что пользовательские функции - это путь, и я пытаюсь понять это для 2Dмассивы, но я не понимаю, как это будет работать для 3D-массивов.

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Вы можете сделать это как двухэтапный процесс. Сначала используйте array_walk с array_multisort для сортировки внутренних массивов по datetime. Затем используйте usort, сравнивая максимальные значения datetime из внутренних массивов:

array_walk($arr, function (&$v) { array_multisort(array_column($v, 'datetime'), SORT_DESC, $v); });
usort($arr, function ($a, $b) {
    return strcmp(max(array_column($b, 'datetime')), max(array_column($a, 'datetime')));
});
print_r($arr);

Вывод:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [personNum] => 4
                    [type] => status
                    [datetime] => 2019-05-26 16:04:24
                )
            [1] => Array
                (
                    [personNum] => 3
                    [type] => status
                    [datetime] => 2019-05-26 15:59:53
                )
        )
    [1] => Array
        (
            [0] => Array
                (
                    [personNum] => 3
                    [type] => status
                    [datetime] => 2019-05-26 15:59:53
                )
            [1] => Array
                (
                    [personNum] => 2
                    [type] => comment
                    [datetime] => 2019-05-15 11:29:45
                )
        )
)

Демонстрация на 3v4l.org

1 голос
/ 30 сентября 2019

Вы можете попытаться использовать usort:
Сортировать массив по значениям, используя пользовательскую функцию сравнения https://www.php.net/manual/en/function.usort.php

usort($allArray,function($a,$b){
     return $a[0]['dateTime']-$b[0]['dateTime'];
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...