来自PHP中多个foreach数组的复杂usort

时间:2018-10-08 19:35:43

标签: php arrays sorting

我有5个不同的数据库调用来收集用户数据:

$stmt=$db->prepare('SELECT members.email, sites.username, sites.time, sites.id, sites.url, sites.title
                    FROM sites
                    LEFT JOIN members
                    ON members.username=sites.username
                    LEFT JOIN list_friends 
                    ON
                    (CASE
                     WHEN friend1 = :username THEN friend2
                     WHEN friend2 = :username THEN friend1
                    END) = sites.username
                    WHERE sites.username=:username
                    OR (list_friends.friend1 <> :username)
                    OR (list_friends.friend2 <> :username)
                    ORDER BY sites.time ASC');
$stmt->bindParam(':username', $username);
$stmt->execute();
$row2 = $stmt->fetchAll();

每个数据库调用都是唯一的fetchAll变量:$ row,$ row1,$ row2等。

然后我基于该数据创建5个不同的数组集。

foreach( $row2 AS $sites_table ) {
    $data[] = array(
        'type' => 'sites',
        'id' => $sites_table["id"],
        'time' => $sites_table["time"],
        'site' => $sites_table["url"],
        'title' => $sites_table["title"],
        'username' => $sites_table["username"],
        'email' => $sites_table["email"]
    );
}

我有比较功能

function cmp($a, $b)  {
    $ad = new DateTime($a['time']);
    $bd = new DateTime($b['time']);

    if ($ad == $bd) {
        return 0;
    }

    return $ad < $bd ? -1 : 1;
}

最后我根据比较结果进行排序。

if (isset($data) && $data !== NULL) {
    usort($data, "cmp");
    for($i=(count($data)-1)-($feed-1);$i>=(0);$i--){
        if ($i >= 0) {
            // echo out result of arrays
        }
    }
}

我的最终目标是使所有显示的数据按data ['time']排序,最新数据['time']始终显示在顶部,然后显示下一个最新的,等等。

不幸的是,看来排序仅针对每个用户的每个阵列,而不是针对所有用户的所有数组数据。

因此它正在显示

之类的输出
user1 -> $row1 -> 1 minute ago
user2 -> $row5 -> 30 seconds ago
user1 -> $row2 -> 10 seconds ago
user3 -> $row1 -> 4 minutes ago
user1 -> $row1 -> 2 minutes ago
user2 -> $row1 -> 45 seconds ago
user2 -> $row5 -> 55 seconds ago
etc.

那么我将如何制定一种排序算法,以按顺序显示最新的时间戳,而与行或用户无关

user1 -> $row2 -> 10 seconds ago
user2 -> $row5 -> 30 seconds ago
user2 -> $row1 -> 45 seconds ago
user2 -> $row5 -> 55 seconds ago
user1 -> $row1 -> 1 minute ago
user1 -> $row1 -> 2 minutes ago
user3 -> $row1 -> 4 minutes ago
etc.

0 个答案:

没有答案