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

その理由は、上記の各セットのフォーマットが異なるためです。個別のクエリを簡単に実行できますが、理想的ではありません。さらに、後でページネーションが台無しになります。

では、その 1 つのクエリでこれらのループを実行するにはどうすればよいでしょうか。どんな助けでも大歓迎です!ありがとう。

///// アップデート /////

これは私が今持っているものであり、まさに私が望むものを提供しますが、行31〜42も表示します(現在、DBには存在しません):

$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));
    }
}

注:それはゼロベースである可能性があります。その場合、1ベースで記述したように$i、ステートメントのハードコードされた数値を変更する必要があります。caseしかし、私はあなたがその考えを理解していると思います。

于 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が返されるかについて混乱しています。すべての行を含む配列を返すのではなく、1 行だけを返します。通常、この配列を反復処理するべきではありません。必要な特定の列にアクセスするだけです。

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 に答える