• ベストアンサー

foeach

IDと名前とパスワードを入力したsample.csvがあり、 $shop = file('sample.csv'); として、foreachを利用して配列に入れたとします。 foreach($shop as $val){ list($li_id ,$li_name, $li_pass) = split("\t",$val); if($id == $li_id){ echo "a"; exit; }else{ echo"b"; exit; } } として、フォームから送られてきたIDと、 csvに入っているIDが一致したらaを表示、 一致しなければbを表示というように上記のプログラムを書きました。 しかし、csvファイルの一番上のIDでなければ、 すべてbが表示されてしまいます。 exit;をとると今度は、 「abb」や「bab」など、すべて表示されてしまいます。 どのようにすれば一致したらaを表示、しなければbを表示というようにできるのでしょうか。

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

ループの中でechoはないでしょう・・・ フラグをつかってみてはどうでしょう? (breakはしなくてもOK) $flg=false; foreach($shop as $val){ list($li_id ,$li_name, $li_pass) = split("\t",$val); if($id == $li_id){ $flg=true; break; } } if($flg) echo "a"; else echo "b";

hukazuo
質問者

お礼

ありがとうございました^^ フラグを使用するのですね。。。 確かにループの中でエコーしたらそうなりますよね。。。。

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

その他の回答 (2)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

回答してから気づきました foreach($shop as $val){ list($li_id ,$li_name, $li_pass) = split("\t",$val); if($id == $li_id){ echo "a"; exit; } } echo"b"; exit; こういうことですね

hukazuo
質問者

お礼

ありがとうございました^^

全文を見る
すると、全ての回答が全文表示されます。
  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

>exit;をとると今度は、 >「abb」や「bab」など、すべて表示されてしまいます。 これがやりたいこと(一致したらaを表示、しなければbを表示)ではないのですか

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

関連するQ&A

  • PHPでログインフォーム

    PHPで簡易的なログインフォームを作成しようと思っています。 name.csvにてユーザーの名前の管理、 pw.csvにてID,パスワードの管理をしようと考えています。 $name = file('name.csv'); $pw = file('pw.csv'); foreach($pw as $val){ list($li_pw_id ,$li_id, $li_pass) = split("\t",$val); if($li_id == $id){ if($li_pass != $pass){ echo "ログイン失敗"; exit; }else{ foreach($shop as $val){ list($li_shop_id ,$li_shop_name, $info_flag) = split("\t",$val); if($li_pw_id == $li_shop_id){ echo "ログイン成功"; } } } }else{ echo "ログイン失敗"; exit; } } と、上記のようにプログラムを記述すると、 ID・パスワードがあっていてもログイン失敗になります。 echoを使用していろいろ確かめた結果、 $li_idが$idと一致しても最後まで読みこんでしまうため、 最終的に$li_id != $idと判断されてしまっているようです。 どのようにすれば、修正できるのか教えていただきたく思います。 上記以外でも、何かいい案があれば教えて下さい。

    • ベストアンサー
    • PHP
  • テーブルデータ表示

    mysqlからデータをphpで取得し以下のような多次元配列になっています。 Array ( [0] => Array ( [id] => 116 [name] => あああ ) [1] => Array ( [id] => 58 [name] => いいい ) [2] => Array ( [id] => 89 [name] => ううう ) ) 単純にデータを表示させたく以下のようにしましたが<th>$key2</th>の箇所が上記配列の場合 2回繰り返されて表示されてしまいます。ここはフィールド名なので1回の表示でいいのですが どのように記述すれば思うような表示になるでしょうか? echo "<table border=\"1\">"; echo "<tr>"; foreach ($tmp1 as $key => $val) { foreach ($val as $key2 => $val2) { echo "<th>" . $key2 . "</th>"; //フィールド名 } } echo "</tr>"; foreach ($tmp1 as $key => $val) { echo "<tr>"; foreach ($val as $key2 => $val2) { echo "<td>" . $val2 . "</td>"; // 取得したデータをある分だけ繰り返し } echo "</tr>"; } echo "</table>";

    • ベストアンサー
    • PHP
  • if文の繰り返し・・・?

    $cnt = 0; foreach($sample as $val){ list($id,$date,$comment ,$comment1,$comment2) = split("\t",$val); $cnt++; $date = split("/",$date); if (ereg($date[$cnt0], $val)) { $sample .=<<<EOM <tr></td>$id</td><td>$comment</td><td>$comment1</td></tr> EOM; } echo <<<EOM <table> $sample </table> EOM; として、配列の中からdate[$cnt]に一致したものをすべて出したいのですが、上記のようにすると、 最初に一致したものしか排出されません。 date[0]と一致するものを探すため$sampleを上から流れて、 一致したところからdate[1]を探すようになってしまってるからだと思うのですが、、、、。 これをdate[0]と一致するものが見つかった場合、 一番上から再びdate[1]を検索するといった感じにしたいのですが、 この場合どうしたらよいのでしょうか。

    • ベストアンサー
    • PHP
  • PHPでCSVの一部の行を編集したい

    掲示板の管理画面の様な感じで、 PHPでCSVファイル内の一行を編集するフォームを作りたいと思っています。 フォームには新規投稿と、編集用のボタンがあり、 編集用で送られてきたものを受け取るPHPプログラムは以下の通りです。 if($mode == "edit"){ foreach($csv as $val){ list($li_id, $li_date, $li_comment) = split("\t",$val); $fp = fopen(csv' , 'w'); if($li_id == $info_no){ $csv[$li_id] = "$li_id\t$date_y/$date_m/$date_d\t$comment\t\n"; }else{ $csv[$li_id] = "$li_id\t$li_date\t$li_comment\t\n"; } } $fp = fopen('csv' , 'w'); fputs ($fp, $csv[$li_id]); for ($i=0; $i<1000; $i++){ fputs ( $fp,$csv[$i]); } fclose($fp); } としたのですが、うまくいきませんでした。 なぜか、編集した文章と、最後に新規で追記した文章が追加されてしまいます・・・・。 「あいうえお」を新規で追記した後、 1. あいうえお 2. かきくけこ 3. さしすせそ 4. たちつてと の2を編集すると 1.あいうえお 1.あいうえお 2.かきくけこ(編集した) 3.さしすせそ 4.たちつてと となってしまいます。。。。 新規で追記されたものがない場合は 空行が追記されてしまいます。 いろいろ試行錯誤したのですが、さっぱりわかりません。 教えて下さい。

    • 締切済み
    • PHP
  • PHPでCSVファイルの任意の行だけを編集したい

    簡易掲示板の管理画面を作成しようと思っていますが、 うまくいかずに悩んでいます。 入力フォームで送られてきた内容をcsvファイルに書き込み、 それを表示するという掲示板なのですが、 管理画面ではそのcsvファイルを操作して、 任意の書き込みを修正・削除できるようにしたいと考えています。 以下、PHPコードです。 if($mode == "edit"){ foreach($csv as $val){ list($li_no, $li_date, $li_comment) = split("\t",$val); if($li_no == $info_no){ $csv[$info_no] = "$id\t$date_y/$date_m/$date_d\t$comment\t\n"; fputs($fp,$csv[$info_no]); fclose($fp); } } }else{ $dat = "$id\t$date_y/$date_m/$date_d\t$comment\t\n"; $fp = fopen('$csv' , 'w'); fputs ($fp, $dat); for ($i=0; $i<1000;$i++){ fputs ( $fp,$csv[$i]); } fclose($fp); } 編集用のフォームで$info_noを飛ばして、 CSVファイル内の$li_noと一致した場合、 $li_noの行を書き換えという処理をしているつもりなのですが、 なぜか、他の行がすべて消えて、 編集した行だけがファイル内に残ります。 いろいろと検索して試してはみたのですが、 どうもうまくいきません。 どなたか教えてください。 お願いします。 これ以外の方法で簡単にできる方法があれば そちらも教えていただけたら幸いです。

    • ベストアンサー
    • PHP
  • 共通部分の処理をまとめたいです

    以下はある条件に該当するものを10件分表示する処理で、正しく機能しています。 次に「ここから~ここまで」の部分は同一ソースなので、共通化しようと考えています。 一度要所の部分を表に出して(foreachの上)関数化したのですが、 Fatal error: Cannot break/continue 1 level というエラーでうまくいきませんでした。(breakを使ってはいけない場所で使っているという事のようです) //表示件数 $show_number = 10; foreach ( $output->items as $hoge ){ if(条件A){ if(条件A-1){ --------------------- ここから ---------------------------------- if( $counter >= $show_number ){break;}//表示件数設定 else { $counter++;//+1 echo "<li>『" . $hoge->id . "』</li>"; } --------------------- ここまで ---------------------------------- } } elseif (条件B)) { if(条件B-1){ --------------------- ここから ---------------------------------- if( $counter >= $show_number ){break;}//表示件数設定 else { $counter++;//+1 echo "<li>『" . $hoge->id . "』</li>"; } --------------------- ここまで ---------------------------------- } } } 知識不足で恐縮ですが、 処理をまとめる方法をご教示いただけないでしょうか。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • CSVファイルからタイトル別一覧表示

    CSVファイルからタイトル別一覧表示 PHP初心者です。質問させてください。 以下のようなCSVファイルを読み込み、2列目の値をタイトルに一覧を作りたいのですが ループの中でどのように表記すればよいのでしょうか? 0,アイテム1,りんご 0,アイテム2,さば 1,アイテム1,グレープ 0,アイテム1,バナナ 0,アイテム2,いか <?php $array = file("shopdata.csv"); foreach($array as $line){ $line = explode("," , $line); if($line[0] == "0"){ echo '$line[1]'; echo '<ul>'; echo '<li>'.$line[2].'</li>'; } } ?> </ul> 以下のように表示したいのですが、上記では「$line[1]」もループしてしまい一覧になってしまいます。 アイテム1 <ul> <li>りんご</li> <li>バナナ</li> </ul> アイテム2 <ul> <li>さば</li> <li>いか</li> </ul> このように表示するにはどういった記述をすればいいのでしょうか? ご教示いただけますでしょうか。

    • 締切済み
    • PHP
  • array_randで要素が数字の場合の処理方法

    PHPのarray_randについて教えて下さい。 下記のようなソースを作りましたが思った通りの結果になりません。 //(A) $test=array(3,5,8,11,14,24,26,28); print_r($test); foreach ($test as $val) { echo $val.'<br>'; } //(B) $keys = array_rand($test, 5);//決められた数を抽出 print_r($keys).'<br><br>'; foreach ($keys as $val) { echo $val.'<br>'; } Aの部分の結果は Array ( [0] => 3 [1] => 5 [2] => 8 [3] => 11 [4] => 14 [5] => 24 [6] => 26 [7] => 28 ) foreachの部分の出力↓ 3 5 8 11 14 24 26 28 となりこれは特に問題ありません。 Bの部分でAの配列から5つランダムで取り出したいのですが、結果は Array ( [0] => 0 [1] => 3 [2] => 5 [3] => 6 [4] => 7 ) 0 foreachの部分の出力↓ 0 3 5 6 7 となってしまい、Aの配列の添え字の中から5つの数字が選ばれるようになってしまいます。 Aの添え字ではなく「3,5,8,11,14,24,26,28」の数字から5つランダムで取り出すにはどのような書き方をすればよいのでしょうか? ご回答よろしくお願い致します。

    • ベストアンサー
    • PHP
  • csvファイルのタブで区切られた部分まで削除

    csvファイルaを list($li_a,$li_b,$li_c,) = split("\t",$val); というようにタブで区切られた部分でリスト化しました。 配列の順番をabc順に並べようとして、 sortを使ったのですが、 一番初めの$li_aを基準に並べ変えられてしまいます。 $li_bを基準に並べ変えたい場合どうしたらよいのでしょうか。 csvファイルの一番初めのタブで区切られる部分まで削除という指示をすれば出来そうかなと思ったのですが、、、、。

    • ベストアンサー
    • PHP
  • 集計プログラム

    sub fanc{ my $dir = "ディレクトリ";my @array = @_; my $n = $array[0];my $id = $array[1]; my @csv1 = ('AAA.csv','BBB.csv','CCC.csv','DDD.csv',EEE.csv'); my @csv2 = ('FFF.csv','GGG.csv','HHH.csv','III.csv',JJJ.csv'); my @csv3 = ('KKK.csv','LLL.csv','MMM.csv','NNN.csv','OOO.csv'); opendir(DIR, $dir) or exit; @pairs = grep { -f "$dir/$_" ? $_ : '' } readdir(DIR); close(DIR); if($id == 1){ $pattern = $csv1[$n -1]; } elsif($id == 2){ $pattern = $csv2[$n -1]; } elsif($id == 3){ $pattern = $csv3[$n -1]; } }else{ undef; } @files = grep(/$pattern/, @pairs); until(@files == 0){ my $data = shift @files; open(IN, $data) or exit; @file = <IN>;chomp @file; close(IN); foreach my $i (@file){ my @m = split(/,/, $i); push my @rec1, $m[1]; push my @rec2, $m[2]; } $val1 += $rec2[0]; shift @rec2; $val2 += $rec2[0]; shift @rec2; $val3 += $rec2[0]; shift @rec2; $val4 += $rec2[0]; shift @rec2; $val5 += $rec2[0]; shift @rec2; $val6 += $rec2[0]; shift @rec2; $val7 += $rec2[0]; shift @rec2; $val8 += $rec2[0]; shift @rec2; $val9 += $rec2[0]; shift @rec2; $val10 += $rec2[0]; shift @rec2; } %tmp; my @rec = grep( !$tmp{$_}++, @rec1 ); foreach my $x (@rec){$sum1 += $x;} $res1 = $val1 / $sum1 * 100; $res2 = $val2 / $sum1 * 100; $res3 = $val3 / $sum1 * 100; ・ ・ こんな感じでパーセンテージを出していますが、csvのデータは全て違うのに、引数を変えて並べて実行すると 答えが同じように返ってきます。どこかおかしいのでしょうか?

    • ベストアンサー
    • Perl