2012-09-29 201 views
2

我希望有人能帮助我在这...如何通过PHP循环遍历MySQL结果?

这里是我的查询:

$query_articles = mysql_query("SELECT * FROM articles ORDER BY article_date DESC LIMIT 30") or die(mysql_error()); 
$row_articles = mysql_fetch_assoc($query_articles); 

我想这样做是显示所有30个结果,但我想它是这样:

// Show article #1 

// Then loop through articles 2-7 

// Then show article #8 

// Then loop through articles 9-30 

原因是因为我对上面列出的每组都有不同的格式。我可以很容易地做单独的查询,但这不是很理想,再加上之后我的分页会搞砸。

那么,我将如何做这些循环与一个查询?任何帮助,将不胜感激!谢谢。

///// UPDATE /////

好吧,这是我现在已经和它给了我正是我想要的,但它也显示31-42行(甚至不现在在我的数据库中):

​​

任何想法为什么它显示额外的行?另外,如果我用mysql_fetch_array,它上升到排55

///// UPDATE /////

这里是我最后的代码,如果任何人都需要它。我还添加了另一个条件,因为我也想分开9-30行。

$query_articles = mysql_query("SELECT * FROM articles ORDER BY article_date DESC LIMIT 32") or die(mysql_error()); 

$shown_articles = array(1, 8); 
$article_range = range(9, 30); 
$article_index = 1; 

while($row_articles = mysql_fetch_assoc($query_articles)) { 
    if (in_array($article_index, $shown_articles)) { 

     echo '<p>'.$article_index.' '; 
     echo $row_articles['title']; 
     echo '</p>'; 

    } elseif (in_array($article_index, $article_range)) { 

     echo '<p>'.$article_index.' '; 
     echo $row_articles['title']; 
     echo ' - 9-30</p>'; 

    } else { 

     echo '<p>'.$article_index.' '; 
     echo $row_articles['title']; 
     echo ' - 2-7</p>'; 

    } 
    $article_index++; 
} 
+1

你是什么意思循环2-7和9-30?你想显示一个标题或关于它们的任何内容,或者只是完全跳过它们,只显示1和8? – akronymn

+1

欢迎来到Stack Overflow!如果你可以避免它,请不要使用'mysql_ *'函数,它们不再被维护,并且社区已经开始[弃用过程](http://goo.gl/KJveJ)。相反,您应该了解[准备好的语句](http://goo.gl/vn8zQ)并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli的)。如果你不能决定,[本文](http://goo.gl/3gqF9)将有助于选择。如果你想学习,[这里是一个很好的PDO相关教程](http://goo.gl/vFWnC)。 – vascowhite

+0

对不起,我应该更清楚。例如,我想显示标题。所以,$ row_articles ['标题']和其他东西。 – Ironank

回答

0
$shown_articles = array(1, 8); 
$article_index = 1; 
foreach ($row_article as $article) { 
    if (in_array($article_index, $shown_articles)) { 
     // Show article 
    } else { 
     // Do something else 
    } 
    $article_index++; 
} 
1

可以使用modulo operator来实现这一点:

$query_articles = mysql_query("SELECT * FROM articles ORDER BY article_date DESC LIMIT 30") or die(mysql_error()); 
$row_articles = mysql_fetch_assoc($query_articles); 

$i=0; 
foreach($row_articles as $article) { 
    if($i % 8 == 0) { 
    // do stuff for row 0, 8 .. 
    } 
    else { 
    // do stuff for other rows 
    } 
    $i++; 
} 
+0

但第16条是9到30之间,它不应该显示。 –

+0

@WaleedKhan他还说'然后循环通过第9-30条“,但我很确定他确实想显示匹配8的倍数的文章,但第一个例外。 –

+0

我不确定这个,模运算符对我来说是新的。是的,我想要第一篇文章,然后循环2-7,然后显示#8,然后9-30。 – Ironank

2

你先根据你的结果创建一个迭代器:

$rows = new ArrayIterator($row_articles); 

那么你一定要防止迭代器倒带:

$articles = new NoRewindIterator($rows); 

这可以帮助您创建子迭代器(例如,为您的列表)不倒带,但继续。

然后,你可以像你认为合适的操作就可以了:

foreach ($articles as $i => $article) 
{ 
    switch ($i) 
    { 
     case 1: 
      article_display($article); 
      article_list(new LimitIterator($articles, 0, 6)); 
      break; 

     case 8: 
      article_display($article); 
      article_list(new LimitIterator($articles, 0, 21)); 
      break; 

     default: 
      throw new Excpetion(sprintf("Unexpected i: %d", $i)); 
    } 
} 

注:这可能是$i是从零开始的,那么你需要在case语句来更改硬编码的数字,因为我写它1基于。但我认为你明白了。

0

你(以及所有其他答案)对mysql_fetch_assoc返回的内容感到困惑。它不返回包含所有行的数组,它只返回一行。您通常不应该遍历此数组,您只需访问所需的特定列。

虽然我不明白你的if声明,因为它在两个分支中都做同样的事情。我想真正的应用程序做不同的事情,我刚刚插入占位符。

$query_articles = mysql_query("SELECT * FROM articles ORDER BY article_date DESC LIMIT 32") or die(mysql_error()); 

$shown_articles = array(1, 8); 
$article_index = 1; 
while ($row_articles = mysql_fetch_assoc($query_articles)) { 
    if (in_array($article_index, $shown_articles)) { 

     echo '<p>'.$article_index.' '; 
     echo $row_articles['title']; 
     echo '<br>Stuff for articles in $shown_articles'; 
     echo '</p>'; 

    } else { 

     echo '<p>'.$article_index.' '; 
     echo $row_articles['title']; 
     echo '<br>Stuff for articles NOT in $shown_articles'; 
     echo '</p>'; 

    } 
    $article_index++; 
} 
+0

谢谢,我正要发布此解决方案,因为我意识到我不需要foreach。就像使用while循环那样很好地工作。 if(in_array($ article_index,$ shown_articles))我从上面Waleed的例子中使用。会有比这更好的解决方案吗? – Ironank

+0

if(in_array(...))对我来说似乎很好。只是基于它你没有做任何不同的事情。 – Barmar