1

私は次のコードに取り組んでいます:

function form_Subcat_Picker() {
    $mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME);
    if (!$mysqli) {
        die('There was a problem connecting to the database.');
    }       
    $catPicker = "SELECT Subcatid, Subcatname, Parentid
            FROM ProductSubCats
            ORDER BY Subcatid";
    if ($Result = $mysqli->query($catPicker)){
        if (!$Result) {
            echo 'Could not run query: ' . mysql_error();
            exit;
        }
        while ($row = $Result->fetch_assoc()) { 
            echo '<div class="parentid'.$row['Parentid'].'">';
            echo '<select name="Subcatid">';
            echo '<option value="'.$row["Subcatid"].'">'.$row["Subcatname"]."</option>";
            echo '</select>';
            echo '</div>';
        }
    }
    $mysqli->close();
}

私がやりたいことは、次の行にあります。

while ($row = $Result->fetch_assoc()) { 
            echo '<div class="parentid'.$row['Parentid'].'">';

$ row ['Parentid']の部分が前の反復と同じである場合、その特定の行を無視します(divクラスを追加します)

たとえば、最初の実行で$ row ['Parentid']が1で、次のループで再び1の場合、新しいdivを作成せず、他のすべてをエコーし​​て同じdivに保持します。 。

これは可能ですか?または、共通の親ID(複数の親IDがある)を共有している場合、複数のサブカテゴリIDと名前を1つのdivに表示するにはどうすればよいですか?

echo '<option value="'.$row["Subcatid"].'">'.$row["Subcatname"]."</option>";
4

3 に答える 3

1

多分これはうまくいくでしょう:

$last_id = 0;
while ($row = $Result->fetch_assoc()) {
    if ($last_id != $row['Parentid']) {
        echo '<div class="parentid'.$row['Parentid'].'">';
        echo '<select name="Subcatid">';
        echo '<option value="'.$row["Subcatid"].'">'.$row["Subcatname"]."</option>";
        echo '</select>';
        echo '</div>';
        $last_id = $row['Parentid'];
    }
}

ただし、最善の解決策は、SQL ステートメント、おそらく句でそれらを除外することだと思いますが、そのGROUP BY方法は 100% わかりません :)。

よろしく、

于 2012-12-27T23:47:37.267 に答える
1

これは、ループの基本的なことです。現在のループを見てみましょう:

 while ($row = $Result->fetch_assoc()) { 
     ...
 }

特定の条件でスキップしたいので、このスキップを紹介しましょう (最初に条件を気にする必要はありません)。

 while ($row = $Result->fetch_assoc()) { 
     if ($condition) continue;
     ...
 }

では条件を整理してみましょう。最後のものを調べたい$rowので、コピーを保持する必要があります。

 $last = null;
 while ($row = $Result->fetch_assoc()) { 
     if ($condition) continue;
     ...
     $last = $row;
 }

これで、条件を作成するために必要なデータが得られ$last、最後の行 (存在する場合) を含めることができるため、比較を行うことができます。

 $last = null;
 while ($row = $Result->fetch_assoc()) { 
     $condition = $last && $row['Parentid'] === $last['Parentid'];
     if ($condition) continue;
     ...
     $last = $row;
 }

そして、それは基本的にそれです。forロジックによっては、ループに切り替えたい場合があります。

 for ($last = null; $row = $Result->fetch_assoc(); $last = $row) { 
     $condition = $last && $row['Parentid'] === $last['Parentid'];
     if ($condition) continue;
     ...         
 }

これにより、たとえば、各反復 (スキップされた反復も含む) で、ループの最後に$lastが に設定されます。$row

代わりに、または類似continueのものを出力しないなど、さまざまなことを自然に行うことができます。<div>

お役に立てれば。

于 2012-12-27T23:48:33.447 に答える
1

これは私がそれを書く方法です。

// add a variable to hold the previous value
$previous_parent_id = "";

while ($row = $Result->fetch_assoc()) { 

  // then add an if statement to see if it's the previous statement
  if ($row['parent_id'] != $previous_parent_id){
    echo '<div class="parent_id'.$row['parent_id'].'">';
    $previous_parent_id = $row['parent_id'];
  }
}

これらのレコードをループします

ID ParentID
1  0
2  0
3  1
4  1
4  2
4  2

出力は次のようになります。

<div class="parent_id0">
<div class="parent_id1">
<div class="parent_id2">
于 2012-12-27T23:48:39.747 に答える