Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在foreach循环中正确使用foreach循环_Php_Mysql_Loops_Foreach - Fatal编程技术网

Php 在foreach循环中正确使用foreach循环

Php 在foreach循环中正确使用foreach循环,php,mysql,loops,foreach,Php,Mysql,Loops,Foreach,我的数据库中有以下数据: initial | word --------------------------- E | Example1 E | Example2 N | Nextexample1 所需输出: E Example1 Example2 N Nextexample1 E Example1 E Example2 N Nextexample1 <?php $pdo = new PDO('

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

initial   |    word
---------------------------
   E      |    Example1
   E      |    Example2
   N      |    Nextexample1
所需输出:

E
Example1
Example2

N
Nextexample1
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>
因此,对于每个首字母,它应该显示该首字母以及以该首字母开头的所有单词。对我来说很重要:每个单词都应该显示在一个单独的分区中,这样就不会有
分组(
单词
分隔符','))
建议了

此时的输出:

E
Example1
Example2

N
Nextexample1
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>
此时我的代码:

E
Example1
Example2

N
Nextexample1
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>




问题:

E
Example1
Example2

N
Nextexample1
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>

显然,我需要一个额外的循环来解决这个问题,但我不知道如何确切地做到这一点?

我将使用
group\u 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>



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

$initial = null;

foreach ($stmtrecords as $result) {
    if ($result['initial'] !== $initial) {
        $initial = $result['initial'];
        // output header div
    }
    // output word
}
请注意:在上面的代码中,您正在将数据库中的数据直接嵌入HTML。在插入HTML之前,应先转义该数据。有关如何正确转义数据的更多信息,请参阅和