2015-04-25 69 views
2

我有我的数据库中的以下数据:正确使用foreach循环的

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

所需的输出:

E 
Example1 
Example2 

N 
Nextexample1 

所以对于每个初始,就应该显示初始以及从该首​​字母开始的所有单词。对我来说重要的是:每个单词都应该显示在一个单独的div中,因此不需要GROUP_CONCAT(SEPARATOR ', ')

输出在这一刻:

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> 

问题:

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

回答

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> 
0

你实际上并不需要一个额外的循环,你只需要一点点额外的逻辑在你的循环。由于查询通过initial对数据进行排序,因此您只需检查$result['initial']在循环中的更改时间,并仅在此时输出标题。

$initial = null; 

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

只需谨慎一点:在上面的代码中,您将数据直接从数据库嵌入到HTML中。在插入HTML之前,这些数据应该被转义。有关如何正确转义数据的更多信息,请参阅phptherightway.comZend Escaper