我正在尝试使用循环内的循环创建列表。我有3张桌子。
T1:教员 T2:关键字 T3:facID,keywordID我创建了一个select语句来交叉连接行并吐出这样的东西:
Faculty Name A
keyword-a keyword-b keyword-c
Faculty Name B
keyword-a keyword-d keyword-f
一切都很好,除了我需要在关键字列表中添加逗号而我的代码没有做到这一点。我的关键字仍在没有逗号的情况下循环播放。
<?php while ($row = mysql_fetch_assoc($result)) { ?>
<?php if ($row['facID'] !== $lastID ) { ?>
<?php echo $row['facname']; ?><br />
<?php $lastID = $row['facID']; ?>
<?php } ?>
<?php $kwords = array();
foreach($row as $k => $v) {
if (strpos($k, 'kword') === 0) {
$kwords[] = $v;
}
}
echo implode(', ', $kwords);
} ?>
有什么建议吗?我是一个菜鸟,我希望它是非常明显的!
答案 0 :(得分:1)
您的代码似乎存在一些问题,因此我将尽力解决这些问题。
首先,你有很多打开和关闭<?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 />";
这仍然不是最好的代码,但你可以重构它。
这里的想法是,每次设施更改时,数组都会输出并重置,因此数组包含该设施的所有关键字,并且它们全部一起输出,而不是仅报告为它们返回的数据库行的一部分。循环完成后,您必须手动报告最后一行,因为循环中会处理常规报告。