循环嵌套数组生成不同长度的表
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>';
【讨论】:
谢谢。我会试试的。您能否确认一下:您是否只使用了一个数组,其中包含 level 和 centre 信息? 是的,我就是这么做的:P 好的。这是一个进步!但是从嵌套数组中,我的代码获取的是数组位置而不是值,所以我显示 0 而不是 A1,3 代表 B2 等。我将更新上面的代码,以准确地向您展示我现在正在使用的内容。 我刚刚贴在上面。和你指定的完全一样。 它对我有用,伙计,你更新了数组,并删除了旧数组?以上是关于循环嵌套数组生成不同长度的表的主要内容,如果未能解决你的问题,请参考以下文章