0

请帮我遍历数组。

当我在命令行上运行 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]=> array(4) { ["startt"]=> string(8) "08:00:00" ["2013-04-01"]=> string( 6)“唐纳德”[“2013-04-02”]=>字符串(5)“黛西”[“2013-04-03”]=>字符串(6)“米奇”}[1]=>数组(4 ) { ["startt"]=> string(8) "12:00:00" ["2013-04-01"]=> string(5) "Pluto" ["2013-04-02"]=> string (5) "高飞" ["2013-04-03"]=> 字符串(6) "米妮" } [2]=> 数组(4) { ["startt"]=> 字符串(8) "14:00 :00" ["2013-04-01"]=> NULL ["2013-04-02"]=> 字符串(6) "米奇" ["2013-04-03"]=> 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 ?>

输出是:

开始数组

2013-04-01 阵列

2013-04-02 阵列

2013-04-03 阵列

开始数组

2013-04-01 阵列

2013-04-02 阵列

2013-04-03 阵列

开始数组

2013-04-01 阵列

2013-04-02 阵列

2013-04-03 阵列

4

2 回答 2

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>';
于 2013-07-24T05:50:59.763 回答
1

fetch_assoc()在 while 循环中,只获取行本身,并假设您知道列名。假设您的表中有名为usernameand的列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>"; 

PS
我没有使用fetch_assoc(),因为没有意义。你只想要每一行,我通过它们的数字索引得到它们。在通过索引创建数组之前,您不需要在 PHP 中初始化数组,因此您不需要编写$result = array(). 您还应该将您new mysqli()的页面放在单独的安全页面上。

于 2013-07-24T01:35:44.497 回答