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"]=> string(5) "デイジー" ["2013-04-03"]=> string(6) "ミッキー" } [1]=> array(4 ) { ["startt"]=> string(8) "12:00:00" ["2013-04-01"]=> string(5) "冥王星" ["2013-04-02"]=> string (5) "グーフィー" ["2013-04-03"]=> string(6) "ミニー" } [2]=> array(4) { ["startt"]=> string(8) "14:00 :00" ["2013-04-01"]=> NULL ["2013-04-02"]=> string(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 に答える