2

我希望有人可以帮助我解决这个问题...

这是我的查询:

$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

原因是因为我对上面列出的每个集合都有不同的格式。我可以轻松地进行单独的查询,但这并不理想,而且之后会搞砸我的分页。

那么我将如何使用那个查询来执行这些循环呢?任何帮助,将不胜感激!谢谢。

///// 更新 /////

好的,这就是我现在所拥有的,它给了我我想要的东西,但它也显示了第 31-42 行(现在我的数据库中甚至不存在):

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

$shown_articles = array(1, 8);
$article_index = 1;
foreach ($row_articles as $article) {
do {
    if (in_array($article_index, $shown_articles)) { 

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

    } else {

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

    }
    $article_index++;
} while($row_articles = mysql_fetch_assoc($query_articles));
}

关于它为什么显示额外行的任何想法?此外,如果我使用 mysql_fetch_array,它会上升到第 55 行。

///// 更新 /////

如果其他人需要,这是我的最终代码。我还添加了另一个条件,因为我还想分隔 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++;
}
4

4 回答 4

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 开始。但我想你明白了。

于 2012-09-29T16:05:26.867 回答
1

您可以使用模运算符来实现此目的:

$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++;
}
于 2012-09-29T15:59:59.230 回答
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++;
}
于 2012-09-29T17:02:06.683 回答
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++;
}
于 2012-09-29T15:59:25.350 回答