質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.53%

CSVファイルを読み込んでテーブル表示をさせたい。

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,475

bitcoiner2045

score 29

下記read_csv.phpのコード53行目
echo "<td>", es(number_format($price)), "</td>";が、
下記のようにエラーが出ますが、該当箇所を見ても何が間違っているのかがわかりません。
お手数おかけしますが、ご回答頂けると幸いです。
宜しくお願いします。

エラーログ

[01-Aug-2018 05:50:03 UTC] PHP Warning:  number_format() expects parameter 1 to be float, string given in /Applications/MAMP/htdocs/read_csv.php on line 53

read_csv.php(CSVファイルを読み込んでテーブル表示する)

<?php
require_once("util.php");
?>

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>SplFileObjectでCSVファイルを読み込む</title>
<link href="../../css/style.css" rel="stylesheet">

<link href=""../../css/tablestyle.css" rel="stylesheet">
</head>
<body>
<div>
      <?php
      $filename = "mydata.csv";
      try {
        //ファイルオブジェクトを作る(rb読み込みのみ。ファイルの先頭から読み込む)
        $fileObj = new SplFileObject($filename, "rb");
    } catch (Exception $e) {
        echo '<span class="error">エラーがありました。</span><br>';
        echo $e->getMessage();
        exit();
    }
    //CSVファイルを読み込む(完全な空行はスキップする)
    $fileObj->setFlags(
      SplFileObject::READ_CSV
      | SplFileObject::READ_AHEAD
      | SplFileObject::SKIP_EMPTY
      | SplFileObject::DROP_NEW_LINE
      );
     //テーブルのタイトル行 
      echo "<table>";
      echo "<thead>";
      echo "<th>","ID","</th>";
      echo "<th>","商品名","</th>";
      echo "<th>","価格","</th>";
      echo "</tr></thead>";
      //値に取り出して行に表示する
      echo "<tbody>";
      foreach ($fileObj as $row) {
      //配列を変数に取り出す
      list($id, $name, $price) = $row;
      //価格が入ってない場合はスキップする
      if ($price=="") {
           countinue;
      }
      //1行ずつテーブルに入れる
      echo "<tr>";
      echo "<td>", es($id), "</td>";
      echo "<td>", es($name), "</td>";
      echo "<td>", es(number_format($price)), "</td>";
      echo "</tr>";
      }
      echo "</tbody>";
      echo "</table>";
      ?>
      </div>
      </body>
      </html>


export_csv.php(PHPのデータをCSVファイルに書き出す)

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>SplFileObjectでCSVファイルに書き込む</title>title>
<link href="../../css/style.css" rel="stylesheet">
</head>
<body>
<div>
    <?php
    $filename = "mydata.csv";
    //CSVのヘッダ行
    $csv_header = ["id","名前","年齢","趣味"];
    //CSVのデータ
    $csv_data = [];
    $csv_data[] = ["a10","高橋久美","36","沢登り"];
    $csv_data[] = ["a11","手塚雄一","31","トレラン"];
    $csv_data[] = ["a12","戸高栄里","18","料理"];
    $csv_data[] = ["a13","迫田信治","23","ボルダリング"];
    $csv_data[] = ["a14","山岡南美","26","サーフィン"];

    try {
    //ファイルオブジェクトを作る(wb 新規書き出し。ファイルがなければ作る)
    $fileObj = new SplFileObject($filename, "wb");
    } catch (Exception $e) {
        echo '<span class="error">エラーがありました。</span><br>';
        echo $e->getMessage();
        exit();
    }
    //ヘッダ行をCSVに書き出す
    $fileObj->fputcsv($csv_header);
    //データをCSVに追加する
    foreach ($csv_data as $value) {
        $fileObj->fputcsv($value);
    }
    echo "{$filename}の書き出しが終わりました。";
    ?>
</div>div>
</body>
</html>


convert2shiftjis_crlf.php(Shift-JIS,CRLF,ダブルクォーテーション囲みに変換する)

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>ShiftJIS, CRLFファイルに変化する</title>
</head>
<body>
<div>
   <?php
   $filename = "mydata.csv";
   $filename_win = "mydata_win.csv";

try{
 //ファイルオブジェクトを作る(rb読み込み専用)
$fileObj = new SplFileObject($filename, "rb");
//ファイルオブジェクトを作る(wb新規書き出し。ファイルがなければ作る)
$fileObj_win = new SplFileObject($filename_win, "wb");
} catch (Exception $e) {
    echo '<span class="error">エラーがありました。</span><br>';
    echo $e->getMessage();
    exit();
}

//ストリングを読み込む
$readdata = $fileObj->fread($fileObj->getSize());
$fileObj = NULL;
//改行コードをLFからCRLFにする
$outdata = str_replace("\n","\r\n",$readdata);
//ShiftJISに変換する
$outdata = mb_convert_encoding($outdata, "SJIS","auto");

//ダブルクォーテーションで囲む
$outdata = str_replace(",",'","', $outdata);
$outdata = str_replace("\r\n", "\"\r\n\"", $outdata);
//先頭に追加し、最後の1個を取り除く
$outdata = '"' . $outdata;
$outdata = mb_substr($outdata, 0, -1, "SJIS");

//ファイルに書き込む
$written = $fileObj_win->fwrite($outdata);
if ($written===FALSE){
     echo '<span class="error">', "{$filename_win}に保存できませんでした。</span>";
 } else {
      echo "{$filename}をShift-JIS、CRLFに変換した{$filename_win}を書き出しました。";
 }
 ?>
</div>
</body>
</html>

イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m6u

    2018/08/01 15:46

    直接のアドバイスではありませんが、PhpStorm、NetBeans、Eclipseなどデバッグに強い開発環境を導入してみてはいかがでしょうか。自己解決しやすくなりますよ。

    キャンセル

  • bitcoiner2045

    2018/08/01 15:51

    PhpStorm、NetBeans、Eclipseググって導入してみます。ありがとうございます。

    キャンセル

  • i_sugiyama_tomo

    2018/08/01 15:59

    あとexport_csv.phpでCSVに書き出してるデータとread_csv.phpで呼び出してるデータの内容が違いますね

    キャンセル

回答 3

checkベストアンサー

+1

number_format() expects parameter 1 to be float, string given

$price に文字列データが入っていて、float型じゃないから関数の処理を適用できない、
って意味です。
単語を辞書引きすればわかる簡単なエラーメッセージです。
phpにだってデータ型の概念はあります。
es(number_format(floatval($price))) などとして型変換してあげてはいかがでしょうか。
(ただし、$priceに数値として解釈できない文字列が入っている場合の対策も考えないといけないかもしれませんが。)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

申し訳ありませんコメントを書いているつもりで間違えました

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/01 16:04

    お気遣いなく。ありがとうございます。

    キャンセル

+1

PHP Warning:  number_format() expects parameter 1 to be float, string given in /Applications/MAMP/htdocs/read_csv.php on line 53

number_format() 関数は、第一引数に float(型)を期待していますが、string(型)が与えられました。

という意味です。エラーメッセージは定型なので、覚えてください。

では、実際のコードはどうなっているのか。number_formatを使っているところなので、この部分ですね。

echo "<td>", es(number_format($price)), "</td>";

第一引数は () の中のこと。$price のことです。この $price が string(文字列型) ですよと言われてます。

var_dump($price);
echo "<td>", es(number_format($price)), "</td>";

というように、var_dump() で確認すれば、

string(00) "000000" 

というように値を確認できるし、型も確認できます。

文字列をfloat(浮動小数型)に変換して、あげれば良いことがわかります。

変換(キャスト)はPHPの場合、

(float) $price;

のようにすれば良いので、

echo "<td>", es(number_format((float) $price)), "</td>";

というように記述すれば良いことがわかります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/01 15:59

    長文書いてたら、すでに閉じてたw

    キャンセル

  • 2018/08/01 16:04

    よくある

    キャンセル

  • 2018/08/01 16:13 編集

    それはそれでいいけどね。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる