質問: fopen('new_data.csv', 'w'); foreach ($csv as $value) { var_dump($value); echo ''; fwrite($fp, $value); } fclose($fp); ``` ### 試したこと エラー文からforeach文の中の$valueがおかしいのでは?というところまでは考えが及んだのですが、どういう指定をしたらいいのか分かりません。 値を見ると配列の中に配列があるというのは分かりました。 array(3) { [0]=> array(3) { [0]=> string(10) "データ1" [1]=> string(9) "りんご" [2]=> string(6) "100円" } [1]=> array(3) { [0]=> string(10) "データ3" [1]=> string(9) "ミカン" [2]=> string(6) "100円" } [2]=> array(3) { [0]=> string(10) "データ2" [1]=> string(9) "かぼす" [2]=> string(6) "100円" } 配列の中に配列ということでforeachを2回行えばよいのかと思ったのですがエラーになってしまいました。 ``` foreach ($csv as $values) { foreach($values as $value) { var_dump($valus[$value]); echo ''; fwrite($fp, $value); } ``` Trying to access array offset on value of type null 指定の仕方をご教示いただけけませんでしょうか? よろしくお願いいたします。
回答: `$data = fgetcsv($temp, 0, ",")`の箇所で、 $dataは配列になっています。 そして、`$csv[] = $data;`で$csvに格納されているので、$csvは配列の配列になっています。 その$csvを `foreach ($csv as $value) {` するのだから、$valueは配列です。 $dataに受け取ったときのままの配列です。 乱暴なやり方なら、implodeを使ってカンマ区切り文字列を作ったりします。 たとえば ``` fwrite($fp, '"' . $value[0] . '","' . $value[1] . '","' . $value[2] . '"' . PHP_EOL); ``` とか。 ダブルクォーテーションマークで括ることで、たとえばExcelで読み込んでも大丈夫な気がします。 しかし、普通なら、自力の文字列連結でやらずに行います。 fputcsvを使うやり方もありますし、 SplFileObject クラスのfputcsvメソッドを使うやり方もあります。