0

これが私の問題です。mysqlデータベースから結果を返し、forループを使用して結果をエコーし​​ています。他の結果の中にネストするためにいくつかのテーブルデータを使用しているため、少し複雑になりますが。このコードは、「Spain」というdiv内に「PabloPicasso」を返しますが、スペインにも「El Greco」がある場合は、1つではなく2つの「Spain」divを取得します。

つまり、すべてではなく、テーブル列の一意の値ごとに1回だけ結果を返したいのです。

$results = array();
while ($row = mysql_fetch_assoc($result)) {
$results[] = $row;
}

foreach ($results as $row)
    {
    echo "<div class=\"".$row['country']."\">".$row['country'];
    echo "<div class=\"Box\">";
    $tempCountry = $row['country'];

    foreach ($results as $row)
    {
    if ($row['country']== $tempCountry) echo "<div>artists name</div>";
    }

    echo "</div>";echo "</div>";
}

ネストされたループの構築なのか、それとも他の何かなのか、わかりません!!! 助けてください

4

3 に答える 3

1

結果を国別に並べ替える必要があるという@Kalpeshに同意します。

今、本当に必要なのは 1 つだけなのに、複数のネストされたループがあります。ループを 1 つだけ使用してデータを調べてみてください。反復ごとに、$tempCountry 値をチェックして、現在の行の国と比較して異なるかどうかを確認します。そうである場合は、現在の を閉じて<div>、新しい を開き<div>、$tempCountry 値を更新する必要があります。それ以外の場合は、アーティストの名前をエコーし​​ます。

編集:以下に追加された疑似コード

  • データベースからデータを取得します (クエリはデータを国別にソートする必要があります)
  • $tempCountry を null に初期化する
  • すべての行をループします
    • $tempCountry がこの行の国と等しい場合
      1. アーティストを印刷する
    • そうしないと
      1. $tempCountry をこの行の国に設定します
      2. divタグを閉じる
      3. 新しい div タグを開く
      4. アーティストを印刷する

最初のループで div タグを閉じたくないことに注意してください。また、ループが終了したら div タグを閉じる必要があります。

foreach ($results as $row) {

    if ($tempCountry == $row['country']) {

    echo "<div class=\"Box\">";

        echo "<div>artist</div></div>";

    }

    else {

        $tempCountry == $row['country'];

        echo "</div><div class=\"".$row['country']."\">".$row['country'];

        echo "<div class=\"Box\">";

        echo "<div>artist</div></div>";

    }

    echo "</div>";

}
于 2012-07-12T17:40:26.027 に答える
0

私が見つけた解決策は、foreach を別の foreach 内にネストすることでした。外側のループは GROUP BY で SELECTS します。この例では、国ごとに 1 つの外部を取得し、その内部で、その国 (またはその列の値を持つ) 内のすべての人 (または項目) を取得します。本当に便利です。

新しいコード: 解決策 (GROUP BY を使用して外側のコンテナーを構築する)

// create array to build group div
$country = mysql_query("SELECT * FROM table GROUP BY `country`");
// create array for inner contents
$result = mysql_query("SELECT * FROM table ORDER BY name"); 

//array for group(countries in this instance)
$countrys = array();
while ($row = mysql_fetch_assoc($country)) {
$countrys[] = $row;
}
//array for inner contents
$results = array();
while ($row = mysql_fetch_assoc($result)) {
$results[] = $row;
}

$tempCountry="";
foreach ($countrys as $row)
    {   
    $tempCountry = $row['country'];

    echo "<div class=\"".$row['country']."\">";
    echo $row['country'];
    echo "<div class=\"Box\">";
    foreach ($results as $row) {
    if ($tempCountry == $row['country'])
    {
    echo"<div>inner contents of that group</div>";
    }
    }
    echo "</div>";
    echo "</div>";
    }
于 2012-08-01T15:05:01.613 に答える
0

ループの外に空の配列を作成します。出力時に $row の値をループ内の配列にプッシュします。次に、値が配列にまだ存在しない場合にのみ出力します。これにはin_arrayを使用できます。

于 2012-07-12T17:35:22.373 に答える