我这里有这张表
name_relation
[ id name age head ]
[ 1 X1 12 X ]
[ 2 X2 22 X ]
[ 3 X3 54 X ]
[ 4 Y1 4 Y ]
[ 5 Y2 8 Y ]
[ 6 Y3 10 Y ]
我想要得到的是以下
X: X1X2X3
Y: Y1Y2Y3
所以我做了这个循环
$pre = null;
$ed = "";
while($row = $stmt->fetch()){
$name = $row['name'];
$head = $row['head'];
if ($head != $pre) {
echo $ed;
echo "<div>";
echo "$head:";
}
$ed = "</div>";
$pre = $head;
echo $name;
}
echo $ed;
echo "</div>";
在一个空白的页面上它运行得很完美,但当我把它与其他代码结构放在一起时,我发现Web浏览器正在填充并自动修复它,但现在我在循环结束时得到了额外的</div>
,我怎么能解决这个循环成为
<div>
X:X1X2X3
</div>
<div>
Y:Y1Y2Y3
</div>
答案 0 :(得分:2)
虽然使用PHP实现所需结果并不困难,但使用适当的查询可以在数据库中更轻松地解决问题。
试试这个:
SELECT head, GROUP_CONCAT(name SEPARATOR '') AS all_names
FROM tbl
GROUP BY head
将tbl
替换为您的实际表名。您可能还希望按特定顺序获得结果。为此添加ORDER BY head
。
PHP代码现在变为:
while ($row = $stmt->fetch()) {
echo("<div>{$row['head']}:{$row['all_names']}</div>");
}
这就是全部。
仅限PHP的解决方案是跟踪head
的当前值,
当</div>
的值更改但不在第一行之前输出结束标记head
,当值{{1}时输出开始标记<div>
}} 变化。此外,只显示一次head
的值,当它发生变化时,会显示每行head
的值。不要忘记在循环结束后输出结束标记`但是只有至少迭代一次(查询返回了一些内容)。
这听起来很难,但实际上很容易:
name
在上面的代码中,您可以使用一些&#34; magic&#34;而不是// The current value of $['head']
// We assume here NULL is not a valid value for it in the database
// If it happens that you have NULLs in the database in column "head"
// then make sure the query converts it to an empty string. For example:
// SELECT IFNULL(head, '') AS head ...
$head = NULL;
// Process one row at a time
while ($row = $stmt->fetch()) {
if ($row['head'] !== $head) {
// The value of 'head' just changed
// Display '</div>' but not before the first row
if ($head !== NULL) {
// This is not the first row, there is a current value of 'head'
echo("</div>\n");
}
// Display the opening tag '<div>' and new value of 'head', only once
echo("<div>{$row['head']}: ");
// Update the current value of 'head'
$head = $row['head']
}
// Display 'name'; there is nothing special here
echo($row['name']);
}
// After the loop, close the last <div> only if there is one ($head was changed)
if ($head !== NULL) {
echo("</div>\n");
}
。字符串(称为&#34; sentinel&#34;),无法显示在数据库的NULL
列中。