• ベストアンサー

arayy_pushの挙動は?

arayy_pushの挙動は? file関数で読み込んだカンマ区切りのデータ(改行コードはLF)をlist(data1,data2,data3)として、data3には改行コードが含まれたまま、全てのデータ(data1,data2,data3)の最後にaray_push関数で末尾にデータを追加(data4とする)した場合には、data3とdata4の改行コードはどうなるのでしょうか? array_pushのマニュアルには何も書いてなく、自動的にdata4には改行コードが付加されるか確認する方法がわかりません。 アドバイスをお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

提示されたソースを適当に修正していきます。 とりあえず、一行ごとの末尾にデータを一つ付加するのが目的ということで良いですよね。 であれば、splitやexplode関数でカンマごとに区切った配列を作ってlistを使って配列を変数に展開擦る必要はないですね。 <?php $logfile = "./data.csv"; //ログファイルを取得 $array_log = file($logfile); //ログファイルの行数(配列数)を取得 $max = count($array_log); //データを付加した新しいログの落とし先の配列 $result = array(); for($i=0; $i<$max; $i++){ //rtrim関数にて一行の末尾の改行を削除 $new_line = rtrim($array_log[$i]); //新しく挿入したい値を宣言 $data_nasi ="何かしらのデータ"; //新しいデータを末尾に付加 $new_line .= "," . $data_nasi; //最後に改行コードを付加 $new_line .= "\n"; //配列$resultに付加情報の含まれた一行を追加 array_push($result, $new_line); } //forを抜けた後、配列$resultの値をファイルに書き込み。 $max = count($result); for($i=0; $i<$max; $i++){ //位置行ずつファイルに書き込む処理 } ?> こんな感じですかね。 これで目的は達成すると思います。 ただし、ある程度非効率な部分もあったりするので、また勉強を進めていって、新しく関数を覚えたときにでも、この処理の手法を考えなおして、つくり直してみてください。

すると、全ての回答が全文表示されます。

その他の回答 (5)

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.5

[quote cite="http://jp.php.net/manual/ja/function.file.php "] ファイルを配列に入れて返します。 配列の各要素はファイルの各行に対応します。改行記号はついたままとなります。 失敗すると file() は FALSE を返します。 注意: FILE_IGNORE_NEW_LINES を指定しない限り、 配列に取り込まれた各行は行末文字も含みます。 行末文字を取り除きたい場合には rtrim() を使用する必要があります。 [/quote] $array_log = file('./data.csv', FILE_IGNORE_NEW_LINES); // PHP5.0.0+ $array_log = array_map('rtrim', file('./data.csv')); // PHP5.0.0-

すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

改行をとりのぞくなら配列に対してstr_replaceがつかえます <? $logfile = "./data.csv"; $array_log = file($logfile); $array_log=str_replace(Array("\r","\n"),"",$array_log); for($i=0; $i<count($array_log); $i++){ list($data1,$data2,$data3) = split(",", $array_log[$i]); $ar = array("$data1", "$data2", "$data3", "$data_nasi"); var_dump($ar); } ?>

すると、全ての回答が全文表示されます。
回答No.3

開発環境として、WindowsのPCをご利用であれば、XAMPPという、WebサーバとPHPとMySQLなど、Webで必要なものが一括でインストール出来るソフトウェアがありますので、そういうものを導入してみては如何でしょうか。 その上で、WindowsのローカルでPHPを実行して動作を試してみる、というのが早いと思います。 で、回答ですが、 質問したい内容は、断片情報から推測して考えているようで、回答に行き着きません。 まず、 listですが、これは配列を命名した変数に展開するための制御構造です。 <?php $ary = array("a", "b", "c"); //という配列があった場合、 list($data1, $data2, $data3) = $ary; // とすると、 // $data1 == "a" // $data2 == "b" // $data3 == "c" // となります。 ?> そして、array_pushですが、これは「配列」の末尾に値を付加するための関数です。 <?php $ary = array("a", "b", "c"); //という配列があった場合、 array_push($ary, "d"); // と記述すると、 // $ary[0] == "a" // $ary[1] == "b" // $ary[2] == "c" // $ary[3] == "d" // となります。 ?> ですので、listで配列を変数に展開した後では、展開したものはすでに配列でないので、array_pushを使うことは出来ません。 で、それはおいておいて、「array_pushは改行コードを付加したりとかするのか」という質問に関してだけ言えば、 array_***関数系は、「配列操作」を行うが、「文字列操作」を行うものではないので、改行があるないは特に関係もないし、自動的に付加したり削除したりはしません。 もし、文字列中の末尾の改行コードなどを取り去りたい、ということであれば、rtrim関数を使います。 <?php $data = "aaaabbbbcccc\n" // \nは改行です。 //上記データの末尾の改行を取り去りたい。 $data = rtrim($data); // 結果は、 // $data == "aaaabbbbcccc" // となります。 ?> もし、上記内容でよくわからなければ、一度、質問者さんがどういう実装をしたいのか教えてください。 もうちょっと順を追った説明ができると思います。

midorin_h
質問者

補足

親切な解答ありがとうございます。 具体的なコードは $logfile = "./data.csv"; $array_log = file($logfile); for($i=0; $i<count($array_log); $i++){ list($data1,$data2,$data3) = split(",", $array_log[$i]); $data_nasi =""; $ar = array("data2", "data3", "$data_nasi"); } この先は、ファイルに書き込み処理を行ないます。 こんな感じです。 file関数は改行コードを取り除かないとマニュアルにあり、実際にループ処理中で一旦スプリットさせて、変数に代入し、末尾に空データを入れて、ファイルに書き込み。とういうようなコードです。

すると、全ての回答が全文表示されます。
回答No.2

実際にコードを書いて動かしてみれば確認できるのではないでしょうか?

すると、全ての回答が全文表示されます。
回答No.1

まずどうしてそんな非効率な処理にするのでしょうか? CSVデータをファイルから呼び出すならfgetcsvを利用した方がいい。 それと挙動が気になるならまずは自分で簡単なサンプルを書いて実際にためしたらどうですか?

すると、全ての回答が全文表示されます。

関連するQ&A