我正在处理以下代码:
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。
这可能吗?或者,如果他们共享一个共同的parentid(有多个父ID),我怎么能在一个div中出现多个子类别id和名称? 对于这一行:
echo '<option value="'.$row["Subcatid"].'">'.$row["Subcatname"]."</option>";
答案 0 :(得分: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%确定如何做到这一点:)。
此致
答案 1 :(得分: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>
。
希望这有帮助。
答案 2 :(得分: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">