Php 合并2个PDO数组并按共享列排序

Php 合并2个PDO数组并按共享列排序,php,pdo,Php,Pdo,我有两个不同的查询,它们返回不同的PDO FETCH_ASSOC数组: $stmt1->execute(); $stmt2->execute(); 每个数组从两个不同的表返回结果,这些表具有不同的列,但是它们有一个公共列:datetimestamp,该列以以下格式存储:2018-04-28 20:31:23。 是否可以按日期降序或升序对结果进行排序,以反映排序的结果 可以通过合并两个数组并使用自定义排序函数对结果进行排序来实现 假设$rows1代表$stmt1的行,$rows2代表

我有两个不同的查询,它们返回不同的PDO FETCH_ASSOC数组:

$stmt1->execute();
$stmt2->execute();
每个数组从两个不同的表返回结果,这些表具有不同的列,但是它们有一个公共列:datetimestamp,该列以以下格式存储:2018-04-28 20:31:23。
是否可以按日期降序或升序对结果进行排序,以反映排序的结果

可以通过合并两个数组并使用自定义排序函数对结果进行排序来实现

假设$rows1代表$stmt1的行,$rows2代表$stmt2的行。生成的数组将是:

$rows = array_merge($rows1, $rows2);
现在,您可以使用以下方法对结果数组进行排序:

其中函数数组$r1,数组$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;
}
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;
});

很抱歉回答得太晚,我在最后找到了另一个解决方案,但我会将此标记为已解决,因为它看起来是一个很好的解决方法
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;
}
// 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
        )

)