您的代码似乎存在一些问题,所以我会尽力解决所有问题。
首先,你有很多开启和关闭<?php>
标签,它确实与你的代码的可读性有关。考虑保留包含在单个<?php>
代码块中的尽可能多的代码。例如,而不是这样的:
<?php if ($row['facID'] !== $lastID) { ?>
<?php echo $row['facname']; ?><br />
<?php $lastID = $row['facID']; ?>
<?php } ?>
...您可以整合所有这些PHP代码到这一点:
<?php
if ($row['facID'] !== $lastID) {
echo $row['facname'] . "<br />";
$lastID = $row['facID'];
}
?>
接下来,你不呼应出来后,输出任何类型的视觉突破的你的implode()
ed数组。这将导致下一个标题与上一个标题的输出在同一行输出。例如,你的前两个标题最终会是这样的:
Faculty Name A
keyword-a keyword-b keyword-cFaculty Name B
keyword-a keyword-d keyword-f
注意如何Faculty Name B
是关键字的行结束?
最后,我想你报告的问题是你得到两个链接在一起的关键字。举例来说,如果你有两行数据用相同的设施ID,一个关键字keyword-a
和keyword-b
,另一个keyword-c
和keyword-d
,你会看到输出视觉上没有keyword-b
和keyword-c
之间的逗号。
换句话说,而不是这样的:
keyword-a, keyword-b, keyword-c, keyword-d
...你不是看到这一点:
keyword-a, keyword-bkeyword-c, keyword-d
这也造成缺乏implode
版之间的视觉突破的线,但我相信问题比这更深。我相信你希望所有的关键字为一个给定的设施将被显示在一条线上,而不是分成多行。为此,您需要移动重新初始化阵列的位置,以便在切换到新标题的同时重新初始化它。尝试这样的:
$kwords = array();
while ($row = mysql_fetch_assoc($result)) {
if ($row['facID'] !== $lastID) {
if ($kwords) {
echo implode(", ", $kwords) . "<br />";
$kwords = array();
}
echo $row['facname'] . "<br />";
$lastID = $row['facID'];
}
foreach($row as $k => $v) {
if (strpos($k, 'kword') === 0) {
$kwords[] = $v;
}
}
}
if ($kwords) {
echo implode(", ", $kwords);
}
echo "<br />";
这仍然不是最好的代码,但你可以重构它。
这里的想法是,数组被输出,并每次都重设该设施的变化,使阵列包含所有关键字这一设施,他们都拿到一起输出,而不是仅报告作为数据库的一部分他们与他们一起返回。循环完成后,您必须手动报告最后一行,因为通常的报告是在循环内部完成的。
你发布的代码的输出是什么样的? –
完全如上图所示:Faculty Name和一个列表,在下面的行中有逗号。 – jfer