• ベストアンサー
  • すぐに回答を!

PHPでファイルから取り込んだ数字で計算できない

test.txtの内容 ------ 10 ------ のとき、 <? $file="test.txt"; //ファイルの中の行を配列に格納 $ary=file($file); //テキストファイル内の数字を取得 foreach ( $ary as $key => $value ) { $value = str_replace(array("\r\n","\r","\n"), "", $value); if (strlen($value )>0){ $a=trim($value); } } $a=$a+1; print $a; ?> として、11が出力されることを期待したのですが、 1が出力されてしまいます。 11を出力されるにはどうしたらよいでしょうか? どうぞよろしくお願いいたします。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数405
  • ありがとう数4

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

  • ベストアンサー
  • 回答No.2
  • notnot
  • ベストアンサー率47% (4578/9592)

foreach ( $ary as $key => $value ) { var_dump($value); 。。。。 } と表示させれば原因がわかるのでは?

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご指摘していただいた方法で解決できました。 "10"なのに文字数が5と表示されたので、文字コードが原因かな? と思っていたらビンゴでした! 原因はテキストファイルをUTF-8形式にしていたからのようです。 S-JISにすると解決できました。 UTF-8形式だといろいろ不具合が出るみたいですね。 アドバイスどもありがとうございました!

関連するQ&A

  • 文字列の置き換えについて

    下記のようなテキストファイルを読み込みます。 【お名前】 {@name} 【フリガナ】 {@kana} 【年齢】 {@age} そしてphpでこのようにしました。 $test = array( 'name' => '名前太郎', 'kana' => 'ナマエタロウ', ); $file = 'body.txt'; $body = file_get_contents($file); foreach ($test as $key => $val) { if ( is_array( $val ) ) { foreach ( $val as $val2 ) { $body = preg_replace( "/{@$key}/u", implode(',', $val), $body ); } } else { $body = preg_replace( "/{@$key}/u", $val, $body ); } } echo $body; 結果は、@nameと@kanaは配列にある通りの文字列に変わりますが@ageは そのまま表示されてしまいます。 $testの配列で該当するパターンがない場合には@hogeの値を空白にしたいのですが どうすればいいでしょうか? foreachを$testで行っているのでループ内ではできないような気がしています。 いい方法があれば教えてください!

    • ベストアンサー
    • PHP
  • php配列確認に関して

    $name = array( '0' => 'test', '1' => 'test1', '2' => 'test2', '3' => 'test4', '4' => array( '0' => 'e', '1' => 'r', '2' => 'y', '3' => 'i', ), ); foreach ($name as $key => $value) } print $value; } このうえの配列を確認したいのですが print $value;でやると 4がarrayとなってしまいます 4の中身を確認したいのですか foreachの下に何を書けばいいでしょうか?

    • ベストアンサー
    • PHP
  • PHPでHTMLファイル置換 プログラムについて

    以下のプログラムを書きました。 あるHTMLファイルをテンプレートとし、 中に記述している置換文字列を動的に 表示させるというものです。 しかしなかなか表示されません。 どこがおかしいのでしょうか? --template.html-- <html><head><title>test</title></head> <body> 表題 他いろいろ <!-- data replace --> フッター いろいろ </body></html> --index.php-- $page_lines = File("template.html"); $all_lines=''; foreach( $page_lines as $line ){  $all_lines .= $line; } $str = "<div>出力用データいろいろ</div>"; print preg_replace(/<!-- data replace -->/,$str, $all_lines); 以上です。 よろしくお願いいたします。

    • ベストアンサー
    • PHP

その他の回答 (1)

  • 回答No.1
  • bm_hiro
  • ベストアンサー率51% (200/388)

困った事に、俺の環境では ちゃんと 「11」と表示されてしまいました。 試しに、以下のように書き換えてみると どうなりますでしょうか? <? $file="test.txt"; $value = file_get_contents($file); $a = str_replace(array("\r\n","\r","\n"), "", $value); $a=$a+1; print $a; ?>

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答ありがとうございます。 上記でも同じ結果でした。 原因はテキストファイルの文字コードだったようです。 しかし、ご提案ありがとうございました!

関連するQ&A

  • php foreach文のあとのechoが...

    以下のスクリプトの、<echo A>の部分は出力されるのですが、 <echo B>の部分は出力されません。 何が原因なのでしょうか? // ファイル取得 $filepath = "../../reception.csv"; $file = new SplFileObject($filepath); $file->setFlags(SplFileObject::READ_CSV); // ファイル内のデータループ foreach ($file as $key => $line) { foreach ( $line as $str ){ $records[$key][] = $str; } <echo A> } <echo B>

    • 締切済み
    • PHP
  • smartyでtplファイルでの2次元配列

    お世話になります。 smartyでtplファイル内で2次元配列を書きたいのですがどのようにアクセスしたらいいでしょう? foreachを入れ子にして使いたいのですが なかなかうまくいきません。 *このように使いたいのです PHP側 $txtA_ary[$page][$page_count]//こんな感じに各値が入る $form->addElement('text','txtA',$txtA_ary); tpl側 {foreach key=a_key item=a_item from=$form.txtA.label} {foreach key=b_key item=a_item from=$form.txtA.label.a_key} {$form.txtA.label.$a_key.$b_key} {/foreach} {/foreach}

    • ベストアンサー
    • PHP
  • ファイルの3行目までを出力したい

    Perl初心者です。 test.txtというファイルがあって、その中の1行目から3行目までを 出力したい場合はどうしたらいいでしょうか? open(FILE,"test.txt") || die "Open Error.\n"; @data = <FILE>; close(FILE); foreach (@data) { print $_; } これだと、ファイルの中身が全て出力されてしまいます。

    • ベストアンサー
    • Perl
  • 文字列から指定文字を削除

    こんばんは。お世話になっております。 先日、http://oshiete1.goo.ne.jp/qa4940684.html こちらにて別ファイルにある文字列を変数に代入することをお教えいただきました。(今回の件とは直接的に関係ないと思うのですが・・) 今回再度質問させて頂きたいのは、変数に代入されているテキスト(改行を含まない一行テキスト)を、違う別のファイルに登録されている単語を削除したい。というものです。 その別ファイル(削除すべき単語が登録されているファイル)は、 1 2 3 、 。 のように登録されていており、削除する際、 //変数、$moto_txtに長文の1行テキストが代入されてる。 $file_name = "./data/key.txt";//排他単語の取得 if(file_exists($file_name)){  $f_data_array = file($file_name);  $f_cnt= count($f_data_array);  for($h=0; $h<$f_cnt; $h++){   $delete_key = trim($f_data_array[$h]);   $moto_txt = str_replace($delete_key, "", $moto_txt);//  } } のように、削除したい単語が登録されているファイルを単語単位で配列に格納し、for文で$moto_txtからstr_replace()を使って削除しようとすると、何故か他の文字(今確認しているのは、「ア」です)まで削除されてしまう状況となっております。 何か他の方法はないかな?と色々と調べているのですが、その方法が分からず、また、上記の流れで、何故他の単語まで削除されてしまうのかが分かりません。 どんな些細なことでも結構ですので、アドバイスいただけると幸いです。

    • ベストアンサー
    • PHP
  • ファイル検索

    こんにちは。質問させてください。 あるフォルダ(ここでは$dir = "c:\\test\\file_data\\"とでもしておきます。)内に テキストファイルが複数存在するとします。 test1218.01.file1.txt test1218.10.file1.txt test1218.11.file1.txt test1219.01.file1.txt test1219.10.file1.txt test1219.11.file1.txt test1219.01.file2.txt test1219.10.file2.txt test1219.11.file2.txt 上記のようなファイル名のテキストファイルが存在したとします。 それでこのテキストファイルのうち、以下のファイルの内容を画面に表示したいと 考えています。 test1219.01.file1.txt test1219.10.file1.txt test1219.11.file1.txt 1219(今日の日付という意味), file1(一回目のファイルという意味)で 構成された上記のファイルを指定されたディレクトリ($dir)以下で 検索し上記のファイル名を取得し、また取得したファイルの中身を 表示するロジックを考えています。 ひとつのファイルを取得することはできたのですが、 複数となる(上記の場合は3つ当てはまることはわからないので 指定する日付などで取得ファイル数がかなりことなる)ため うまく書くことができません。 どなたかいいロジックなどをお持ちでしたら ぜひ伝授していただけたらと考えています。 どうかよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPの記述方法について教えて下さい。

    <?php $koukoh = file("http://xxxxx.jp/koukoh.txt"); $key = array_rand($koukoh); $daigaku = file("http://xxxxx.jp/daigaku.txt"); $key = array_rand($daigaku); $shakaijin = file("http://xxxxx.jp/shakaijin.txt"); $key = array_rand($shakaijin); $data = file("http://xxxxx.jp/data.txt"); foreach ($data as $val) { $pattern0="/^(\d+\s.+?\s)(.*?)(高卒)(@.*?)(\n|$)/"; $pattern1="/^(\d+\s.+?\s)(.*?)(大卒)(@.*?)(\n|$)/"; $pattern2="/^(\d+\s.+?\s)(.*?)(高社)(@.*?)(\n|$)/"; $pattern3="/^(\d+\s.+?\s)(.*?)(大社)(@.*?)(\n|$)/"; if(preg_match("$pattern0","$val")){ $val=("$val".'@'."$koukoh[$key]".'→'); }elseif(preg_match("$pattern1","$val")){ $val=("$val".'@'."$koukoh[$key]".'→'."$daigaku[$key]".'→'); }elseif(preg_match("$pattern2","$val")){ $val=("$val".'@'."$koukoh[$key]".'→'."$shakaijin[$key]".'→'); }elseif(preg_match("$pattern3","$val")){ $val=("$val".'@'."$koukoh[$key]".'→'."$daigaku[$key]".'→'."$shakaijin[$key]".'→'); } } $replacement=("$data"."$pattern"); preg_replace("$pattern","$replacement","$data"); print_r ($replacement); ?> ■出力結果 @高校名 →大学名 →会社名 → ※実際には各名称はランダムに出力されています。 ■要望 〇ファイル (1)data.txt (2)koukoh.txt (3)daigaku.txt (4)shakaijin.txt 「data.txt」の中で高卒、大卒、高社、大社それぞれがある行には行末に、 高卒がある場合は「@→高校名→」という文字列を追加。 大卒がある場合は「@→高校名→大学名→」という文字列を追加。 高社がある場合は「@→高校名→会社名→」という文字列を追加。 大社がある場合は「@→高校名→大学名→会社名→」という文字列を追加。 上記に該当しない行はそのまま何も追加せずに表示する。 ※data.txtは英字、数字、日本語が混在しています。 ※高校名、大学名、会社名は(2)~(4)の行ごとに格納されている〇〇名を  ランダムに選択したい。 マッチングはpreg_matchやswitchを使ってみたり、 行末追加はarray_pushなども試してみましたが、うまくいきません。 色々と試していますが、ちょっとパニックに陥っています。 どうかご教授の程、お願い申し上げます。

    • ベストアンサー
    • PHP
  • PHPで2つの変数を表示する方法

    PHP初心者ですがお願いします <?php $test[0]="abcdefghi"; $test[1]="abcdefg"; $test[2]="abcde"; $test[3]="abcdefghij"; $test[4]="abcx"; $replace_1="x"; $result_1="opqr"; $count="0"; while($count <= 4) { $str[$count]= str_replace($replace_1,$result_1,$str[$count]); $count++; } ?> 変数の中身をreplaceで置き換えた後今度は4つの変数中で一番文字数の多い変数のみを表示し その変数の文字数を表示させたいのですがどうすればいいでしょうか mb_strlenで文字数を出すのはできたのですが一番大きい変数を選ぶところがわからないです

    • 締切済み
    • PHP
  • phpの配列を代入

    初めての質問です。 よろしくお願い致します。 phpの配列を代入する方法ですが $data("テスト1#テスト2#テスト3"); $ary= array("5874","9874"); $dataの結果を テスト15874テスト29874テスト3 特定の文字列に「#」に$aryを順番に代入したいのですがわかりません。 str_replaceでなさそうですし、どうすれんばいいのでしょうか?

    • 締切済み
    • PHP
  • PHPのforeachでMysqlにINSERT

    PHPのforeach文を使いMysqlにデータをINSERTしたいです。 配列$resultは以下のような連想配列になっています。 Array ( [0] => Array ( [A] => 1 [B] => 2 [C] => 3 [D] => 4 [E] => 5 ) [1] => Array ( [A] => 2 [B] => 4 [C] => 6 [D] => 8 [E] => 10 ) ) 上記の連想配列をforeach()文で以下の処理をします。 foreach ($result as $key => $value) { /** * データベースへの追加(新規追加時だけ実行。コメント忘れずに) */ $sql = $pdo->prepare('INSERT INTO sample(a, b, c, d, e) VALUES(:a, :b, :c, :d, :e)'); $sql->execute(array(':a' => $value[A], ':b' => $value[B], ':c' => $value[C], ':d' => $value[D], ':e' => $value[E])); } その後データベースでselect * from test;とすると1行目のデータしか格納されていません。原因が不明です。 print すると期待する配列要素が表示されますので配列のデータ配置不備ではありません。 アドバイス頂きたくお願い申し上げます。

    • ベストアンサー
    • PHP
  • 連想配列を array_multisort() でphp4、php5の違い

    いつもお世話になります。 連想配列をarray_multisort()でソートしようとしています。 php5のサーバでは思うように動作するのですが、 php4のサーバでは、ソートされません。 print_r($ary); Array ( [BuID] => 11 [BuName] => aaaa [yymmdd] => 080507 [DateDisp] => 08年05月07日(水) [DateType] => 1210086000 [TaikaiName] => AAAA [HRef] => [AnkName] => ) Array ( [BuID] => 12 [BuName] => bbbb [yymmdd] => 080822 [DateDisp] => 08年08月22日(金) [DateType] => 1219330800 [TaikaiName] => BBBBBBBB [HRef] => [AnkName] => ) ・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・ の様な連想配列をyymmddでソートしようとしています。 php5.2.6だと、 foreach($ary as $key => $row){ $yymmdd[$key] = $row['yymmdd']; } array_multisort($yymmdd,SORT_DESC,$ary); で、$aryにyymmddで並び替えられた配列が入ります。 しかし、php4.2.2では、ソートされず、もとの配列がそのまま$aryに入ってしまいます。 array_multisort()は、phpのバージョンによって動作が異なるような記載もありません。 どなたかわかる方見えましたらよろしくお願いいたします。

    • ベストアンサー
    • PHP