在php中帮助数组

时间:2013-07-24 01:16:21

标签: php arrays

请帮我迭代数组。

当我在命令行上运行它时,我的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数组

2 个答案:

答案 0 :(得分:1)

while循环中的

fetch_assoc()只是抓取行本身,并假设您知道列名称。假设您的表中有一列名为usernameid的列。你的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>';