While循环基于关联数组php的顺序


While loop in order based on associative array php?

我有以下代码,用于显示一个简单朋友系统发送、接收和接受的邀请。

while ($friend = $q -> fetch(PDO::FETCH_ASSOC)) {
      if ($friend['id'] == $user['id'] && $friend['friendAccept'] == 0) echo '<p>You have sent a request to be <a href="http://www.n.com/viewaccount?id=' . $friend['withID'] . '">' . $friend['username'] . '''s</a> friend.</p>';
      if ($friend['withID'] == $user['id'] && $friend['friendAccept'] == 0) echo '<p>You have recieved a request from <a href="http://www.n.com/viewaccount?id=' . $friend['withID'] . '">' . $friend['username'] . '</a>.</p>';
      if ($friend['id'] == $user['id'] && $friend['friendAccept'] == 1) echo '<p>You are friends with <a href="http://www.n.com/viewaccount?id=' . $friend['withID'] . '">' . $friend['username'] . '</a>.</p>';
}

它将显示你有哪些朋友,你发送了哪些朋友请求,以及收到了哪些朋友要求。我从一个mysql查询中得到所有这些。但唯一的问题是它们没有按顺序排列,因为while循环在列表中迭代,并做它应该做的任何事情

有没有一种方法可以在只使用一个查询的情况下将它们整理好?我所说的顺序是指在一个列表中收到的所有请求,在一个名单中发送的请求,以及在一个清单中的朋友。按照目前的顺序,他们被从桌子上拉了下来。

查询。。。

$q = $dbc -> prepare("SELECT social.*, accounts.username FROM social INNER JOIN accounts WHERE social.withID = accounts.ID AND (social.id = ? OR social.withID = ?) AND type = 'friend'");
$q -> execute(array($user['id'], $user['id']));

这是绝对可能的:

SELECT social.*, accounts.username 
FROM social 
INNER JOIN accounts 
WHERE social.withID = accounts.ID 
AND (social.id = ? OR social.withID = ?) 
AND type = 'friend'
ORDER BY 
(social.id = $user_id AND social.friendAccept = 0), 
(social.withID = $user_id AND social.friendAccept = 0),
(social.id = $user_id AND social.friendAccept = 1)

只需将ORDERBY子句按正确的顺序排列即可。按照这种方式,它使用表达式计算的布尔值对其进行排序。

当然,您还应该将$user_id转换为?在准备好的声明中。

您可以更改SQL查询以执行

ORDER BY x ASC/DESC

或者,您可以用PHP创建一个结果数组,然后使用任何PHP排序函数根据任何标准对数组进行排序。

请参阅http://php.net/manual/en/array.sorting.php了解更多信息。

编辑:我认为

uasort()

可能会有所帮助。您可以定义自己的比较函数,然后PHP将根据该函数进行排序。看见http://www.php.net/manual/en/function.uasort.php了解更多信息。

$q = $dbc -> prepare("SELECT social.*, accounts.username FROM social INNER JOIN accounts WHERE social.withID = accounts.ID AND (social.id = ? OR social.withID = ?) AND type = 'friend' ORDER BY social.friendAccept ASC");
$q -> execute(array($user['id'], $user['id']));

ORDER BY social.friendAccept

它将首先获得不被接受的用户。

如果你给出一些数据示例,我可以为提供更多帮助