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 和名称出现在一个 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 回答