将逗号添加到循环内的循环中

时间:2011-08-24 00:06:14

标签: php

我正在尝试使用循环内的循环创建列表。我有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);

  }  ?>

有什么建议吗?我是一个菜鸟,我希望它是非常明显的!

1 个答案:

答案 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-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 />";

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

这里的想法是,每次设施更改时,数组都会输出并重置,因此数组包含该设施的所有关键字,并且它们全部一起输出,而不是仅报告为它们返回的数据库行的一部分。循环完成后,您必须手动报告最后一行,因为循环中会处理常规报告。