【问题标题】:Correct use of foreach loop within foreach loop在 foreach 循环中正确使用 foreach 循环
【发布时间】:2015-07-04 08:14:40
【问题描述】:

我的数据库中有以下数据:

initial   |    word
---------------------------
   E      |    Example1
   E      |    Example2
   N      |    Nextexample1

想要的输出:

E
Example1
Example2

N
Nextexample1

因此,对于每个首字母,它应该显示该首字母以及以该首字母开头的所有单词。对我来说很重要:每个单词都应该显示在一个单独的 div 中,所以请不要GROUP_CONCAT(wordSEPARATOR ', ') 建议。

此时输出:

E
Example1

E
Example2

N
Nextexample1

我此时的代码:

<?php
    $pdo = new PDO('mysql:host=...');           
    $sql = "SELECT DISTINCT initial, word FROM `exampletable` ORDER by initial ASC";
    $stmt = $pdo->prepare($sql);
    $stmt->execute();

    if($stmtrecords = $stmt->fetchall(PDO::FETCH_ASSOC))
    {

    foreach($stmtrecords as $result)
    {
?>

<div>
    <?php echo $result['initial'];?>
</div>
<br>
<div>
    <?php echo $result['word'];?>
</div>
<br><br>

问题:

显然我需要一个额外的循环来解决这个问题,但我不知道该怎么做?

【问题讨论】:

    标签: php mysql loops foreach


    【解决方案1】:

    我会使用group_concat作为

    <?php
        $pdo = new PDO('mysql:host=...');           
        $sql = "SELECT initial, group_concat(word) as word FROM `exampletable` group by initial ORDER by initial ASC";
        $stmt = $pdo->prepare($sql);
        $stmt->execute();
    
        if($stmtrecords = $stmt->fetchall(PDO::FETCH_ASSOC))
        {
    
        foreach($stmtrecords as $result)
        {
           $words = $result['words'];
           $words_array = array();
           if(strlen($words) > 1) {
             $words_array = explode(',',$words);
           }
    ?>
    
    <div>
        <?php echo $result['initial'];?>
    </div>
    <br>
    <div>
        <?php
         if (count($words_array) > 0 ){
           foreach($words_array as $val){
             echo $val.'<br />';
           }
         }
        ?>
        <?php echo $result['word'];?>
    </div>
    

    【讨论】:

      【解决方案2】:

      您实际上并不需要额外的循环,您只需要在循环中添加一些额外的逻辑即可。由于查询是按照initial对数据进行排序的,所以只需要在循环中检查$result['initial']什么时候发生变化,只输出那个时候的header即可。

      $initial = null;
      
      foreach ($stmtrecords as $result) {
          if ($result['initial'] !== $initial) {
              $initial = $result['initial'];
              // output header div
          }
          // output word
      }
      

      请注意:在上面的代码中,您将数据库中的数据直接嵌入到 HTML 中。该数据应在插入 HTML 之前进行转义。有关如何正确转义数据的更多信息,请参阅 phptherightway.comZend Escaper

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-15
        • 2016-09-26
        • 2012-07-19
        相关资源
        最近更新 更多