请帮我迭代数组。
当我在命令行上运行它时,我的mysql存储过程返回以下输出:
mysql> call sp_test();
+----------+------------+------------+------------+
| startt | 2013-04-01 | 2013-04-02 | 2013-04-03 |
+----------+------------+------------+------------+
| 08:00:00 | Donald | Daisy | Mickey |
| 12:00:00 | Pluto | Goofy | Minnie |
| 14:00:00 | NULL | Mickey | NULL |
+----------+------------+------------+------------+
3 rows in set (0.00 sec)
(这是一个动态查询,列标题中的日期值不是静态的。)
我可以从php调用这个存储过程并成功填充我这样做的数组:
6 <?php
7 $db = new mysqli('localhost', 'root', 'password', 'db');
8 $sql = "CALL sp_test()";
9 $query = $db->query($sql);
10 $result = array();
11 while ($row = $query->fetch_assoc()) {
12 $result[] = $row;
13 }
14 $query->close();
15 $db->close();
该数组包含: array(3){[0] =&gt; array(4){[“startt”] =&gt; string(8)“08:00:00”[“2013-04-01”] =&gt; string(6)“Donald”[“2013-04-02”] =&gt; string(5)“Daisy”[“2013-04-03”] =&gt; string(6)“Mickey”} [1] =&gt; array(4){[“startt”] =&gt; string(8)“12:00:00”[“2013-04-01”] =&gt; string(5)“Pluto”[“2013-04-02”] =&gt; string(5)“Goofy”[“2013-04-03”] =&gt; string(6)“Minnie”} [2] =&gt; array(4){[“startt”] =&gt; string(8)“14:00:00”[“2013-04-01”] =&gt; NULL [“2013-04-02”] =&gt; string(6)“Mickey”[“2013-04-03”] =&gt; NULL}}
当我尝试迭代数组(使用php)来呈现结果时,我的问题就开始了。
你会建议一个'循环',它会迭代数组并产生命令行结果的html等价物(如本文顶部所示)?
我已经尝试过以下没有做到我想要的事情,然后我变得完全糊涂了。希望你能帮忙。
17 echo "<table>";
18 foreach ($result as $value) {
19 foreach ($value as $key => $data) {
20 echo "<tr>";
21 echo "<td>" . $key . "</td>";
22 echo "<td>" . $value . "</td>";
23 echo "</tr>";
24 }
25 echo "\n";
26 }
27 echo "</table>";
28 //var_dump($query);
29 ?>
此处的输出是:
startt数组
2013-04-01数组
2013-04-02数组
2013-04-03数组
startt数组
2013-04-01数组
2013-04-02数组
2013-04-03数组
startt数组
2013-04-01数组
2013-04-02数组
2013-04-03数组
答案 0 :(得分:1)
fetch_assoc()
只是抓取行本身,并假设您知道列名称。假设您的表中有一列名为username
和id
的列。你的while循环看起来像:
while($row = $query->fetch_assoc()){
$result[] = 'Username: '.$row['username'].', ID: '.$row['id'];
}
也许您希望代码看起来像:
$rows = $query->fetch_row(); $out = '';
foreach($rows as $r){
$out .= '<tr>';
foreach($r as $k => $v){
$out .= "<td>$k</td><td>$v</td>";
}
$out .= '</tr>';
}
echo "<table>$out</table>";
P.S。
我没有使用fetch_assoc()
因为没有意义。你只想要每一行,我用它们的数字索引得到它们。在通过索引创建数组之前,不需要在PHP中初始化数组,因此您不需要编写$result = array()
。您还应该将new mysqli()
放在单独的安全页面上。
答案 1 :(得分:1)
你的内心foreach
就是这样:
foreach ($value as $key => $data) {
echo "<tr>";
echo "<td>" . $key . "</td>";
echo "<td>" . $value . "</td>";
echo "</tr>";
}
问题是$value
是行,因此是数组;当您尝试echo
时,它会打印Array
(并发出通知)。相反,您希望$data
是列:
echo "<td>" . $data . "</td>";
此外,您应该使用正确的HTML转义:
foreach ($value as $key => $data) {
printf("<tr><td>%s</td><td>%s</td></tr>\n",
htmlspecialchars($key),
htmlspecialchars($data)
);
}
<强>更新强>
要从查询输出中保留表格式,首先必须提取打印整行的函数:
function printRow($data)
{
echo '<tr>' . join('', array_map(function($item) {
return sprintf('<td>%s</td>', htmlspecialchars($item));
}, $data)) . '</tr>';
}
然后你必须将第一行视为特殊:
echo '<table>';
$firstRow = true;
while ($row = $query->fetch_assoc()) {
if ($firstRow) {
printRow(array_keys($row));
$firstRow = false;
}
printRow($row);
}
echo '</table>';