Uma_
@Uma_ (ゆま)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

CSVから読み取ったデータをPHPでHTMLテーブルに表示

解決したいこと

CSVから読み取ったデータをPHPでHTMLテーブルに表示したいです。
foreachやfor文を使って試してみたのですが、
CSVの一段目しか表示されず、二段目以降の表示ができません。
CSVの内容を全て表示するためにはどのようにすれば宜しいかお教えください。

発生している問題・エラー

PHP表示結果
スクリーンショット 2022-07-13 3.18.02.png

表示したいCSV
スクリーンショット 2022-07-13 3.16.43.png

index.php

<html>
<head>
    <title>CSV file to HTML table </title>
    <link rel="stylesheet" type="text/css" href="styling.css">
</head>
<body>
<?php
main::start("example.csv");
class main  {
    static public function start($filename) {
        $records = csv::getRecords($filename);
        $table = html::generateTable($records);
    }
}
class html {
    public static function generateTable($records) {
        
    for ($i=1; $i > 0 ; $i++) {

            echo "<table width=''>" ;

        foreach ($records[0] as $tableHeadings => $values) {

            echo "<tr>";
            echo "<th>$tableHeadings</th>";
            echo "<td>$values</td>";
            echo "</tr>";

        }
            echo "</table>";
    }

        }
}
class csv {
    static public function getRecords($filename) {
        $file = fopen($filename,"r");
        $fieldNames = array();
        $count = 0;
        while(! feof($file))
        {
            $record = fgetcsv($file);
            if($count == 0) {
                $fieldNames = $record;
            } else {
                $records[] = recordFactory::create($fieldNames, $record);
            }
            $count++;
        }
        fclose($file);
        return $records;
    }
}
class record {
    public function __construct(Array $fieldNames = null, $values = null )
    {
        $record = array_combine($fieldNames, $values);
        foreach ($record as $property => $value) {
            $this->createProperty($property, $value);
        }
    }
    public function returnArray() {
        $array = (array) $this;
        return $array;
    }
    public function createProperty($name, $value) {
        $this->{$name} = $value;
    }
}
class recordFactory {
    public static function create(Array $fieldNames = null, Array $values = null) {
        $record = new record($fieldNames, $values);
        return $record;
    }
}


?>
</body>
</html>

styling.css

body, html {
    height: 50%;
    margin: 0;
    padding: 0;
}
table {
    border-collapse: collapse;
    border-spacing: 0;
    width: 50%;
    border: 2px solid darkslategray;
}
th, td {

    text-align: center;
    padding: 10px;
    border: 1px solid darkslategray;
}
th{
    background-color: bisque;
}
td{
    background-color:whitesmoke;
}

自分で試したこと

for文の使い方がうまくいきません。
使い勝手のいいfor文で制作を進めております。

HTMLで表示するとCSVテーブルの二段目以降が表示されず
一段目のみが表示され続けた上で無限ループに入ってしまいます。

解決策をご教授ください。宜しくお願いいたします。

0

4Answer

for ($i=1; $i > 0 ; $i++)

これは(breakで脱出しない限り)当然無限ループ。

foreach ($records[0]

[0]を参照しているので当然一段目。

0Like

Comments

  1. @Uma_

    Questioner

    ご指摘ありがとうございます。
    while文とif文を使って必要データを抜き出して作成完了いたしました。

@itagagaki さん、
ご回答ありがとうございます。

https://zeropuro.com/blog/?p=473
こちらの記事を参考にして全てforeachを使って書き直したのですが、
次は何も表示されなくなってしまいました。

おかしい部分などあればお教えいただきたいです。

<?php
main::start("example.csv");
class main  {
    static public function start($filename) {
        $records = csv::getRecords($filename);
        $table = html::generateTable($records);
    }
}
class html {
    public static function generateTable($records) {
        foreach($table as $tbl) {
            foreach($tbl as $new_table) {
                echo $new_str;
                echo "<br>";
            }
        }
    }
}

宜しくお願いいたします。

0Like
foreach($tbl as $new_table) { //最初は$tblの1行目のデータが$new_tableに入る
                echo $new_str;
                echo "<br>";
            }

echo \$new_str;
\$new_strどっから出てきた?

0Like

Comments

  1. @Uma_

    Questioner

    ご指摘ありがとうございます。

    while文とif文を使って必要データを抜き出して作成完了いたしました。
    丁寧にご回答くださいましてありがとうございます。

調べ続けた結果、
while文とif文を使って必要データを抜き出して作成しました。

みなさまご指摘ありがとうございます。

該当するソースコード


<?php
 
// 読み取り専用でtest.csvを開きます。
$f = fopen("example.csv", "r");
// mb_convert_encodingでCSVから取得した文字列をsjisからutf-8に変換
$buf = mb_convert_encoding(file_get_contents($f), "utf-8", "sjis");
// test.csvの行を1行ずつ読み込みます。
while($data = fgetcsv($f)){
    // 1行分の要素すべてを文字列として結合しても空ではない、つまり空行でなければ出力します。
    if(implode($data) != null){
        // 読み込んだ結果を表示します。

        echo("<div>");
        echo("<center>");
        echo("<table>");

        echo("<h4>");
        echo("$data[2]");
        echo("</h4>");
        echo("<tr>");
        echo("<td>$data[0]</td>");
        echo("</tr>");

        echo("</table>");
        echo("</center>");
        echo("<br>");
        echo("</div>");
    }
}
// test.csvを閉じます。
fclose($f);

?>

0Like

Your answer might help someone💌