更改查询结果数组中元素的顺序

时间:2015-10-13 04:25:45

标签: php mysql

[已编辑] 我需要以特定的方式显示数据库中的帖子。 有一个页面,它在设定的时间间隔查询数据库,通过ajax拉出180个最新帖子。 db中的每个帖子都有“source”列,可以是“instagram”或​​“twitter”。 Ajax每个返回30集(或更少)x 6个帖子(如果没有足够的帖子,则更少)。在js的帮助下,所有组都被隐藏,一次只显示一组(6个帖子)。几秒钟后隐藏设置,然后显示下一个。可以把它想象成典型的幻灯片,但是在无限循环中使用帖子而不是图像。

在开始时,什么样的帖子已经成立并不重要。它可能是来自twitter或Instagram或混合的所有6个帖子。但是像往常一样,当项目计划完成时,我被要求改变集合的生成方式。现在,客户希望只有两种类型的集合,其中包含特定顺序的帖子(如下所述)。

所以我的问题是如何改变这个(来自我的ajax文件的简化示例):

    DB details for ref.: table POSTS: id / source / user / date etc.

    $sql="SELECT * FROM posts ORDER BY id DESC LIMIT 180";
    ...
    $stmt->setFetchMode(PDO::FETCH_OBJ);

    $set=1;
    while($row = $stmt->fetch()) {

                      if($set==1){
                            echo '<!--start set--><div class="set">';
                            }
               if($row->source="twitter"){

                    echo '<div class="post twitter">';
                    echo '{all stuff related to this twitter post}';
                    echo '</div>'; 

                    } else if($row->source="instagram") {

                    echo '<div class="post instagram">';
                    echo '{all stuff related to this instagram post}';
                    echo '</div>'; 
                    }

                      if($set==6) {
                            echo '</div> <!--//END set-->';
                          $set=0;
                         }
           }

      $set++
     }

成为让我生成这30集的东西,但是使用这种模式在其中分发帖子:

     <!--First set should has post in order: --
     <div class="set>
        <div class="post twitter">{stuff}</div> {instagram post} {instagram post}
       {instagram post}{instagram post}{twitter post}
     </div> <!--//END set-->    

     <!--Second set order:-->
     <div class="set">
       {instagram} {instagram} {twitter}
       {twitter} {instagram} {instagram}
     </div>

当然不能保证会有足够的帖子用这些模式创建所有30个集合所以我需要创建尽可能多的集合,然后将这两个模式和剩余部分放入集合之前,只需将它们从db中拉出来。 就这样。 提前感谢任何建议/准备解决方案;)等。

1 个答案:

答案 0 :(得分:0)

您可以尝试使用array_filter在两种帖子之间进行拆分。

$posts = $stmt->fetchAll();
$twitterPosts = array_filter($posts, function($post){
    return $post->source == "twitter";
});
$instagramPosts = array_filter($posts, function($post){
    return $post->source == "instagram";
});

$set=1;
while(!empty($twitterPosts) && !empty($instagramPosts))
{
    if($set%2 == 1)
    {
         $instagramPost1 = array_shift($instagramPosts);
         $instagramPost2 = array_shift($instagramPosts);

         $twitterPost1 = array_shift($twitterPosts);
    }
    else
    {
         $instagramPost1 = array_shift($instagramPosts);

         $twitterPost1 = array_shift($twitterPosts);
         $twitterPost2 = array_shift($twitterPosts);
    }

    /* display them */

    if($set==6) {//your condition
        echo '</div> <!--//END set-->';
        $set=0;
    }
    $set++;
}

/* now one of them is empty, you can just display the other one */
if(!empty($twitterPosts))
    /* Display all remaining twitter posts */
elseif(!empty($instagramPosts))
    /* Display all remaining instagram posts */

当然,您应该添加验证,即数组中仍然存在2 array_shift之间的内容。

我希望这有帮助!

编辑:抱歉,我错过了每行只有3项的条件,现在就加入。