我有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.