Объединение двух массивов PDO и сортировка по общему столбцу - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть 2 разных запроса, которые возвращают разные массивы PDO (FETCH_ASSOC):

$stmt1->execute();
$stmt2->execute();

Каждый массив возвращает результаты из 2 разных таблиц с разными столбцами, однако у них есть общий столбец: date ( timestamp , который хранится в этом формате: 2018-04-28 20: 31: 23 ). Можно ли отсортировать результаты по дате (по убыванию или по возрастанию), чтобы повторить отсортированные результаты?

1 Ответ

0 голосов
/ 29 апреля 2018

Вы можете сделать это, объединив оба массива и отсортировав результат с помощью пользовательской функции сортировки.

Скажем, $rows1 представляет строки $stmt1, а $rows2 представляет строки $stmt2. Полученный массив будет:

$rows = array_merge($rows1, $rows2);

Теперь вы можете отсортировать полученный массив с помощью usort function :

usort($rows, function (array $r1, array $r2) { ... });

где function (array $r1, array $r2) - функция сравнения.

Если вы используете PHP7, функция сравнения может быть такой:

function (array $r1, array $r2) {
    $format = 'Y-m-d H:i:s';

    $t1 = DateTimeImmutable::createFromFormat($format, $r1['date']);
    $t2 = DateTimeImmutable::createFromFormat($format, $r2['date']);

    return $t1 <=> $t2;
}

Как видите, для сравнения объектов встроенного DateTimeImmutable класса .

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

Для PHP 5 это будет немного дольше:

function (array $r1, array $r2) {
    $format = 'Y-m-d H:i:s';

    $t1 = DateTime::createFromFormat($format, $r1['date']);
    $t2 = DateTime::createFromFormat($format, $r2['date']);

    if ($t1 == $t2) {
        return 0;
    }

    return ($t1 > $t2) ? -1 : 1;
}

Весь пример для PHP7:

// rows fetched from $stmt1
$rows1 = [
    ['id' => 1001, 'date' => '2018-04-26 08:00:00'],
    ['id' => 1002, 'date' => '2018-04-28 20:11:23'],
    ['id' => 1003, 'date' => '2018-04-28 20:31:23'],
];

// rows fetched from $stmt2
$rows2 = [
    ['id' => 2001, 'date' => '2018-04-27 08:00:00'],
    ['id' => 2002, 'date' => '2018-04-28 20:21:23'],
];

// the resulting array
$rows = array_merge($rows1, $rows2);

// sort the resulting array with our custom sort function
usort($rows, function (array $r1, array $r2) {
    $format = 'Y-m-d H:i:s';

    $t1 = DateTimeImmutable::createFromFormat($format, $r1['date']);
    $t2 = DateTimeImmutable::createFromFormat($format, $r2['date']);

    return $t1 <=> $t2;
});

И вывод будет отсортирован массив, как мы ожидаем:

Array
(
    [0] => Array
        (
            [id] => 1001
            [date] => 2018-04-26 08:00:00
        )

    [1] => Array
        (
            [id] => 2001
            [date] => 2018-04-27 08:00:00
        )

    [2] => Array
        (
            [id] => 1002
            [date] => 2018-04-28 20:11:23
        )

    [3] => Array
        (
            [id] => 2002
            [date] => 2018-04-28 20:21:23
        )

    [4] => Array
        (
            [id] => 1003
            [date] => 2018-04-28 20:31:23
        )

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