- ベストアンサー
csvファイルの不定長フィールドの値を取得する方法
いつもお世話になります。 tst.csv aaa,bbbb,ccc dd,eeeeeee,ffff,gg,hh iii,jj ・・・・・ などのように レコードごとにフィールド数の異なるcsvファイルの 各レコードの値を取得したいのですが、できなくて試行錯誤しています。 フィールドの数が同じならば 例えば、フィールド数が2ならば $array = file("tst.csv"); $c = count($array); $i=0; while($i < $c){ $RowData=$array[$i]; list($fiel1,$fiel2) = split("\,",$RowData); print('$fiel1='.$fiel1.' $fiel2'.$fiel2."<br>"); $i++; } とすればできます。 ところが、フィールド数がいくつあるかわからないので、 list($fiel1,$fiel2) = split("\,",$RowData); を list($fiel) = split("\,",$RowData); としてforeachで値を取り出そうとしましたが、 foreach ($fiel as $Value) { echo $value.'<br>'; } Invalid argument supplied for foreach() というエラーが表示され できません。 何が、Invalid argumentなのか見当がつきません。 各レコードの値を $fiel[1] $fiel[2] $fiel[3] などに格納することはできないものでしょうか。 おわかりになる方なにとぞよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
PHPでは、変数名は大文字、小文字を区別します。 foreachで、$valueと$Valueとなってますが、これは別の変数です。
その他の回答 (2)
- masa6272
- ベストアンサー率66% (93/140)
splitは、分解した文字列を配列として返します。 list($fiel) = split("\,",$RowData); を $fiel = split("\,",$RowData); にしてください。 動くはずです。
お礼
masa6272さん、お早ようございます。 返事遅くなり申し訳ありません。 試してみました。 $array = file($csv); $c = count($array); $i=0; while($i < $c){ $RowData=$array[$i]; //list($fiel1,$fiel2) = split("\,",$RowData); $fiel = split("\,",$RowData); foreach ($fiel as $Value) { echo '$i='.$i.$value.'<br>'; } ++$i; } $i=0 $i=0 $i=0 $i=1 $i=1 $i=1 $i=1 $i=1 $i=2 $i=2 となり、フィールドの数だけループされていることは確認できましたが 値が表示されません。 foreach ($fiel[] as $Value) { とすると、Fatal error: Cannot use [] for reading in foreach ($fiel[$i] as $Value) { とすると、 Warning: Invalid argument supplied for foreach() in ・・・ と、なってしまいます。
- yambejp
- ベストアンサー率51% (3827/7415)
微妙にずれているかもしれませんがこんなかんじでしょうか? <? $fname="test.csv"; $handle = fopen($fname, "r"); while (($row = fgetcsv($handle,1024, ",")) !== FALSE) { $fiel[]=$row; } fclose($handle); print "<pre>"; print_r($fiel); print "</pre>"; ?>
お礼
masa6272さん、どうもお手数をおかけしました。 大文字小文字の誤り。その通りでした。 どうも、すみません。 そして、ありがとうございました。