php
1$f = file( $file_name )
により、テキストファイルを1行ずつ、配列$fに格納することが可能ですが、
この逆で、このようにして取り出した配列を、テキストファイルに書き出す(というか上書き)
することは、簡単にできるのでしょうか?やり方を教えて下さい。
(逆、なので、1次元が行数、2次元が列数、みたいに)
で、それができたら、そのまま保存しても意味がないわけで、
自分がやりたいのは、そのデータのある行のある列の値を変えた状態で、上書き保存をすることです。
それはいかにして行うのでしょうか?
例えば、POSTされたbという一次元の変数と、cという二重配列に対し、
二重配列のb行目の6列目の値を1増やして、上書きしたいとします、以下のように。
php
1<?php 2 3if (isset($_POST['b'])){ 4$b = $_POST['b']; 5$c = filter_input(INPUT_POST,"a",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 6 7$file_name = "log.txt"; 8$c[$b][6]++; 9file_put_contents($file_name, $c); 10} 11 12?>
しかし、このように書いた所、cの出力結果が、
ArrayArrayArrayArrayArrayArrayArray
となってしまいました、つまり、中身が
ArrayArrayArrayArrayArrayArrayArray
のデータになってしまったのです。
部分的に編集どころか、複数行複数列あったデータが、1行の意味のないものになってしまいました、
どのように変更すれば、部分的に編集できるのでしょうか。
回答を受けて。
$cは二次元配列ですね、簡単にはここに元のテキストの全データが入っています。
で、そのデータの内、
$c[$b][6]++;このデータだけ、+1して、ここだけ直して元に戻したいわけです。
二次元配列だとArrayになる?ということですが、以上の事を簡単なコードでなすには、どのようにすれば良いのでしょう?
$cにはlog.txtを二次元配列として格納したデータを入れています。
n行m列目を、a[n][m]にしてる感じです(区切りは.)。
すいませんfile_put_contentsじゃないですね、上書きだから、これだと追記になるんでしたっけ。
php
1print_r($log1); 2 3$log2 = fopen("log.txt", "w"); 4fwrite($log2, $log1); 5fclose($log2);
これを実行すると、出力結果が
Array ( [0] => Array ( [0] => 10 [1] => 1 [2] => 1 [3] => 2 [4] => 3 [5] => 4 [6] => 5 [7] => 6 [8] => 70 [9] => 8 [10] => 9 ) [1] => Array ( [0] => 1 [1] => 1 [2] => 1 [3] => 2 [4] => 30 [5] => 4 [6] => 5 [7] => 6 [8] => 7 [9] => 9 [10] => 9 ) [2] => Array ( [0] => 1 [1] => 1 [2] => 1 [3] => 20 [4] => 3 [5] => 40 [6] => 5 [7] => 6 [8] => 7 [9] => 8 [10] => 9 ) [3] => Array ( [0] => 1 [1] => 10 [2] => 1 [3] => 2 [4] => 3 [5] => 4 [6] => 5 [7] => 60 [8] => 7 [9] => 8 [10] => 9 ) [4] => Array ( [0] => 1 [1] => 1 [2] => 10 [3] => 2 [4] => 3 [5] => 4 [6] => 50 [7] => 6 [8] => 7 [9] => 8 [10] => 9 ) )
となり、log.txtの中が初期化されてしまいます、なぜでしょう。
ちなみに、var_dumpすると、shuffleしてることから番号が乱雑になってますが、
array(5) { [0]=> array(11) { [0]=> string(2) "10" [1]=> string(1) "1" [2]=> string(1) "1" [3]=> string(1) "2" [4]=> string(1) "3" [5]=> string(1) "4" [6]=> string(1) "5" [7]=> string(1) "6" [8]=> string(2) "70" [9]=> string(1) "8" [10]=> string(3) "9 " } [1]=> array(11) { [0]=> string(1) "1" [1]=> string(2) "10" [2]=> string(1) "1" [3]=> string(1) "2" [4]=> string(1) "3" [5]=> string(1) "4" [6]=> string(1) "5" [7]=> string(2) "60" [8]=> string(1) "7" [9]=> int(9) [10]=> string(3) "9 " } [2]=> array(11) { [0]=> string(1) "1" [1]=> string(1) "1" [2]=> string(1) "1" [3]=> string(1) "2" [4]=> string(2) "30" [5]=> string(1) "4" [6]=> string(1) "5" [7]=> string(1) "6" [8]=> string(1) "7" [9]=> string(1) "8" [10]=> string(1) "9" } [3]=> array(11) { [0]=> string(1) "1" [1]=> string(1) "1" [2]=> string(1) "1" [3]=> string(2) "20" [4]=> string(1) "3" [5]=> string(2) "40" [6]=> string(1) "5" [7]=> string(1) "6" [8]=> string(1) "7" [9]=> string(1) "8" [10]=> string(3) "9 " } [4]=> array(11) { [0]=> string(1) "1" [1]=> string(1) "1" [2]=> string(2) "10" [3]=> string(1) "2" [4]=> string(1) "3" [5]=> string(1) "4" [6]=> string(2) "50" [7]=> string(1) "6" [8]=> string(1) "7" [9]=> string(1) "8" [10]=> string(3) "9 " } }
となりました。
回答を受けて、エラーが出たので確認すると、
fwrite() expects parameter 2 to be string,
とのことでした、引数2が文字型でないといけないということですが、
二重配列なんですが、どうすればいいんでしょうか・・・。