循环嵌套数组生成不同长度的表

Posted

技术标签:

【中文标题】循环嵌套数组生成不同长度的表【英文标题】:Loop through nested array to generate tables of different lengths 【发布时间】:2013-05-10 14:33:33 【问题描述】:

我试图显示不同地点对不同级别考试的需求。

我有一些代码可以在一个页面上输出一系列 4 个两列表。

每个表格的第一列显示注册总数,第二列括号中显示总付款。

每个级别都有一个表格。 该级别的每个中心在每个表中都有一行。

例如第一列,最左侧:

A1
______________
______________
Arlington > A1
______________ 
26 (17) 
--------------
El Paso > A1 
______________
8 (8) 
--------------
White Ridge > A1
________________ 
0 (0) 
----------------
Jonestown > A1 
_______________
10 (9) 
----------------
Hochberg > A1 
_____________
5 (0) 
-------------

每个考试级别需要不同的中心,所以我使用了嵌套数组。我可以为每个级别显示不同长度的表,但是我的 sql 查询没有得到任何值——所有内容都只有 0。

另外,我无法在表格中显示每个级别的单独中心。即行

<td class="width8">' . $centre . ' > ' . $level . '</td>

不工作。它只显示“Array > A1”、“Array > A2”等。

有什么想法吗?

// create array
$levels = array(
    "A1" => array(
        'Arlington',
        'El Paso',
        'White Ridge',
        'Jonestown',
        'Hochberg'
    ),
    "A2" => array(
        'Arlington',
        'El Paso',
        'Hochberg'
    ),
    "B1" => array(
        'El Paso',
        'White Ridge',
        'Jonestown',
        'Hochberg'
    ),
    "B2" => array(
        'Arlington',
        'El Paso',
        'White Ridge'
    )
);

// Loop through centres and levels 
foreach ($levels as $level => $centres) 
    echo '<div id="' . $level . '_column">
                <h2 class="'.$level.'">'.$level.'</h2>';
    foreach ($centres as $centre) 
// Prepare
        $stmt1 = $db->prepare("SELECT COUNT(Centre) 
                            FROM exam 
                            WHERE exam.Centre=:centre   
                            AND exam.Level=:level");

        $stmt2 = $db->prepare("SELECT COUNT(Centre) 
                            FROM exam
                            JOIN personal 
                            ON exam.P_ID=personal.P_ID
                                WHERE personal.Paid='1' 
                            AND exam.Centre=:centre 
                            AND exam.Level=:level");

// Bind 
        $stmt1->bindParam(':centre', $centre, PDO::PARAM_STR);
        $stmt1->bindParam(':level', $level, PDO::PARAM_STR);

        $stmt2->bindParam(':centre', $centre, PDO::PARAM_STR);
        $stmt2->bindParam(':level', $level, PDO::PARAM_STR);

// Execute
        $stmt1->execute();
        $stmt2->execute();

// Fetch 
        $row = $stmt1->fetch(PDO::FETCH_ASSOC);
        $row2 = $stmt2->fetch(PDO::FETCH_ASSOC);

        echo '<table class="Font3White">
                       <tr class="Title">
                        <td class="width8">' . $centre . ' > ' . $level . '</td>
                       <tr>';

        if ($row && $row2) 
            foreach ($row as $key => $value) 
                echo '<td>';
                echo $value;
                echo '</td>';
            

            foreach ($row2 as $key2 => $value2) 
                echo '<td> (';
                echo $value2;
                echo ')</td>';
            

            echo '</tr>';
        
        echo '</table>';
     echo '</div>';

【问题讨论】:

【参考方案1】:

也许,这会对你有所帮助。

你只需要注意foreach语法:

foreach($array as $key => $value)

例如:

$array = array(
    "key1" => /*values*/ array(
        "value1",
        "value2"
    ),
    "key2" => /*values*/ array(
        "value1",
        "value2"
    )
);

foreach($array as $key => $values)
    foreach($values as $value)
        echo "$key => $value\n";
    

会回应:

key1 => value1  
key1 => value2  
key2 => value1  
key2 => value2  

所以,你的代码应该是:

// Creates arrays 
$levels = array(
    "A1" => array(
        'Arlington',
        'El Paso',
        'White Ridge',
        'Jonestown',
        'Hochberg'
    ),
    "A2" => array(
        'Arlington',
        'El Paso',
        'Hochberg'
    ),
    "B1" => array(
        'El Paso',
        'White Ridge',
        'Jonestown',
        'Hochberg'
    ),
    "B2" => array(
        'Arlington',
        'El Paso',
        'White Ridge'
    )
);

// Loop through centres and levels 
foreach ($levels as $level => $centres) 
    echo '<div id="' . $level . '_column">
                <h2 class="' . $level . '">' . $level . '</h2>';
    foreach ($centres as $centre) 
// Prepare
        $stmt1 = $db->prepare("SELECT COUNT(Centre) 
                            FROM exam 
                            WHERE exam.Centre=:centre   
                            AND exam.Level=:level");

        $stmt2 = $db->prepare("SELECT COUNT(Centre) 
                            FROM exam
                            JOIN personal 
                            ON exam.P_ID=personal.P_ID
                                WHERE personal.Paid='1' 
                            AND exam.Centre=:centre 
                            AND exam.Level=:level");

// Bind 
        $stmt1->bindParam(':centre', $centre, PDO::PARAM_STR);
        $stmt1->bindParam(':level', $level, PDO::PARAM_STR);

        $stmt2->bindParam(':centre', $centre, PDO::PARAM_STR);
        $stmt2->bindParam(':level', $level, PDO::PARAM_STR);

// Execute
        $stmt1->execute();
        $stmt2->execute();

// Fetch 
        $row = $stmt1->fetch(PDO::FETCH_ASSOC);
        $row2 = $stmt2->fetch(PDO::FETCH_ASSOC);

        echo '<table class="Font3White">
                       <tr class="Title">
                        <td class="width8">' . $centre . ' > ' . $level . '</td>
                       <tr>';

        if ($row && $row2) 
            foreach ($row as $key => $value) 
                echo '<td>';
                echo $value;
                echo '</td>';
            

            foreach ($row2 as $key2 => $value2) 
                echo '<td> (';
                echo $value2;
                echo ')</td>';
            

            echo '</tr>';
        
        echo '</table>';
     echo '</div>';
 

【讨论】:

谢谢。我会试试的。您能否确认一下:您是否只使用了一个数组,其中包含 levelcentre 信息? 是的,我就是这么做的:P 好的。这是一个进步!但是从嵌套数组中,我的代码获取的是数组位置而不是值,所以我显示 0 而不是 A1,3 代表 B2 等。我将更新上面的代码,以准确地向您展示我现在正在使用的内容。 我刚刚贴在上面。和你指定的完全一样。 它对我有用,伙计,你更新了数组,并删除了旧数组?

以上是关于循环嵌套数组生成不同长度的表的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中动态生成嵌套for循环[重复]

嵌套循环:置换由向量表示的 n 维数组

C / C ++如何复制没有嵌套循环的多维char数组?

python生成器比嵌套for循环快吗? [关闭]

重构嵌套循环后的段错误

如何执行嵌套 Thymeleaf 循环以创建包含来自两个 JPA 表类的字段的表