2011-08-24 75 views
0

我正尝试使用循环内的循环创建列表。我有3张桌子。向循环内的循环添加逗号

T1:教师 T2:关键字 T3:facID,keywordID

我创建了一个select语句CROSS JOIN行和吐出这样的事情:

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); 

    } ?> 

有什么建议吗?我是一个noob,我希望这是非常明显的东西!

+0

你发布的代码的输出是什么样的? –

+0

完全如上图所示:Faculty Name和一个列表,在下面的行中有逗号。 – jfer

回答

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-akeyword-b,另一个keyword-ckeyword-d,你会看到输出视觉上没有keyword-bkeyword-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 />"; 

这仍然不是最好的代码,但你可以重构它。

这里的想法是,数组被输出,并每次都重设该设施的变化,使阵列包含所有关键字这一设施,他们都拿到一起输出,而不是仅报告作为数据库的一部分他们与他们一起返回。循环完成后,您必须手动报告最后一行,因为通常的报告是在循环内部完成的。

+0

非常感谢!这就是诀窍! – jfer