[已编辑] 我需要以特定的方式显示数据库中的帖子。 有一个页面,它在设定的时间间隔查询数据库,通过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中拉出来。 就这样。 提前感谢任何建议/准备解决方案;)等。
答案 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项的条件,现在就加入。