php - 回显排序多维数组

标签 php mysql arrays sorting

好的,我正在使用 php 和 mysqli 创建一个 Web 应用程序。 我有一个表friends,设置很简单:

f_id int(11)
uid int(11)
fids TEXT

现在它基本上就像每个用户的一行,fids 由许多用逗号分隔的数值(其他用户 ID)组成,例如:1,2,3 所以我使用这个函数来获取每个用户的好友:

function getFriends($db, $userid)
{
    $q = $db->query("SELECT fids FROM friends WHERE uid='$userid'");
    $ar = $q->fetch_assoc();
    $friends = $ar['fids'];
    $fr = explode(",", $friends);

    return $fr;
}

但每个人都会发布对他们每个 friend 都可见的评论。我的问题来自于尝试按发布时间对这些评论进行排序。 假设我的评论表是:

c_id int(11)
uid int(11)
c_text TEXT
c_time int(11)

我希望能够获取每个“ friend ”发布的评论,将它们全部放入一个数组中,然后根据它们的 c_time 值对它们进行排序,然后将该特定行中的所有值放入评论表。

问题来自于我如何设置我的 friend 表。 我正在使用:

$fr = getFriends($db, $userid);
        $updates = array();
        $i = 0;
        foreach( $fr as $friend)
        {
            // Get Updates from friends and from self
            $q = $db->query("SELECT up.*, u.* FROM updates up
                LEFT JOIN users u ON u.id = '$friend'
                WHERE (up.userid = '$userid') ORDER BY up.up_id DESC");
            while($ar = $q->fetch_array(MYSQLI_BOTH))
            {
                $updates[$i] = $ar;
                $i++;
            }
        }
            $sortArray = array(); 

            foreach($updates as $update){ 
                foreach($update as $key=>$value){ 
                    if(!isset($sortArray[$key])){ 
                        $sortArray[$key] = array(); 
                    } 
                    $sortArray[$key][] = $value; 
                } 
            } 
            $orderby = "up_id";
            array_multisort($sortArray[$orderby],SORT_DESC,$updates); 
            $updates_limit = array_slice($updates, 0, 20);

获取每个 friend 的评论,按时间排序,然后切片到前 20 条。 但是,当我 var_dump($updates_limit) 时,它会获取评论表中的最后一行,然后使其看起来就像每个 friend 都发布了相同的评论。

任何人都可以看到问题或解决此问题的更好方法吗?

最佳答案

我会完全重构 friend 表,使其看起来更像这样:(另外,使用英语 - 字符很便宜:c))

CREATE TABLE friends (
    user_id int FOREIGN KEY REFERENCES user(id)
    , friend_id int FOREIGN KEY REFERENCES user(id)
    , PRIMARY KEY (user_id, friend_id)
);

然后您可以采用基本相同的评论表:

CREATE TABLE comment (
    comment_id int PRIMARY KEY
    , user_id int FOREIGN KEY REFERENCES user(id)
    , comment_text text
    , comment_time datetime
);

您的“查询好友评论”变为:

SELECT comment_id, comment.user_id, comment_text, comment_time
  FROM friends
    INNER JOIN comment
      ON comment.user_id = friends.friend_id
  WHERE friends.user_id = ? #Target it
  ORDER BY comment_time DESC
  LIMIT 0, 20;

您甚至可以通过添加一些索引来加快速度 - 例如评论(user_id)。

关于php - 回显排序多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24356063/

相关文章:

PHP Mysql 表获取只给出第一行

javascript - 如何分离数据并将其注册到数据库中

c++ - 无法从 char*** 转换为 char**

php - WordPress - 删除插件类中定义的操作

php - 友情系统

c# - 如何将字符串数组插入mysql json列

php - 从数据库中提取数组以用作复选框

javascript - 如何根据对象中的属性对对象数组进行分组

java - ArrayList 没有复制开销?

PHP Cron 作业执行时间限制失败