• 締切済み

共通部分の処理をまとめたいです

以下はある条件に該当するものを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>"; } --------------------- ここまで ---------------------------------- } } } 知識不足で恐縮ですが、 処理をまとめる方法をご教示いただけないでしょうか。 よろしくお願いいたします。

みんなの回答

noname#244856
noname#244856
回答No.3

これが一番シンプルかなぁ。 $cnt = 10; foreach ($output->items as $hoge) {  if (条件A && 条件A-1 || 条件B && 条件B-1 and !$cnt--) {   break;  }  echo "<li>『{$hoge->id}』</li>"; } ・副作用完了点 ・演算子の優先順位 この辺りは理解しておく必要がありますけど。

全文を見る
すると、全ての回答が全文表示されます。
  • 4017B
  • ベストアンサー率73% (1310/1785)
回答No.2

え~っと、例文は条件AでもBでも全く同じ処理(echo ~)しかして無いので、これで処理が変わると後出しジャンケンで言われても困るのです(同じ処理を定数回回すだけならfor/whileで処理すべき)。この手の質問者にはいつも言う言葉ですが「回答者はエスパーでは無い」ので。我々は常に質問者が真実公正に語っていると言う前提で回答しています。それとも作者のキモチを考えなければなりませんか…? P.S. とは言いつつ乗りかかった船。 >ifの条件の前にカウント~ 言ってる意味が訳ワカメだけど、それなら単純に if括弧内で処理させれば良いと思いますが…それだと if文毎にカウントさせないとならなくなるので、ご要望の「共通処理部分をまとめる」に反しますが??何かのトンチ大会なら、もうそろそろ種明かししてくださいませんかね。別に自分、釣りスレとか嫌いじゃ無いですよ。 もしかして想定回数、処理される前に抜けてしまう(break)と言うのであれば、berakの条件か $counterの初期数値の方を調整する事で対応可能だと思います。

Search_tmp
質問者

お礼

ご助言ありがとうございます! うまくお伝え出来ていなかったようで、すみません。 なるほど。for/whileを使うんですね。 いただいた情報を元にトライしてみます!

全文を見る
すると、全ての回答が全文表示されます。
  • 4017B
  • ベストアンサー率73% (1310/1785)
回答No.1

こんな感じで。 $show_number = 10; foreach ( $output->items as $hoge ){  if( $counter >= $show_number ){ break; }  if( 条件A && 条件A1 ){   echo ~  }  else if( 条件B && 条件B1 ){   echo ~  }  $counter++; }

Search_tmp
質問者

補足

為になるご助言ありがとうございます! 実際に取り入れてみました。 処理できる事はわかったのですが、 カウントする位置が変わっている為、もとの処理から変わっているようでした。 もとは、 ifの条件文内でカウントした場合でしたが、 ご提示いただいた処理は、ifの条件の前にカウントしていました。 “処理そのものは変えずに”というのは、このソースでは難しいでしょうか。 当方あまり詳しくないので、難易度が上がってくるようでしたらあきらめます。 (遺憾ながら理解できない可能性があるため) よろしくお願いいたします。

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

関連する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
  • 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を表示というようにできるのでしょうか。

    • ベストアンサー
    • PHP
  • コメント欄を出力した後に返信機能を追加したい

    カスタムフィールド名をつけて記事を振り分けていきたいのですが、上手くいきませんどうすれば良いでしょうか? $nextID = $post_ids[$current + 1]; //$currentの1つあと $next2ID = $post_ids[$current + 2]; //$currentの2つあと echo '<ul>'; //1つあとの記事のコメント $args = ['post_id' => $nextID, 'number' => 1]; $comments = get_comments($args); if (empty($comments)) { $comment = 'コメントなし'; } else { $comment = $comments[0]->comment_content; } echo "<li>{$comment}</li>"; //2つあとの記事のコメント $args = ['post_id' => $next2ID, 'number' => 1]; $comments = get_comments($args); if (empty($comments)) { $comment = 'コメントなし'; } else { $comment = $comments[0]->comment_content; } echo "<li>{$comment}</li>"; echo '</ul>';

    • ベストアンサー
    • PHP
  • 同じような処理を一つにまとめたい

    count.txt <?php $dis123=0; $dis001=0; $hoge01=0; ?> ___________ counter.php <?php $vote = $_GET[vote]; $fp = fopen("count.txt", "r+"); include("count.txt"); @flock($fp,LOCK_EX); //今現在(カウント前)の値を書き込む fputs($fp,"<?php \$dis123=$dis123; ?>\n"); fputs($fp,"<?php \$dis001=$dis001; ?>\n"); fputs($fp,"<?php \$hoge01=$hoge01; ?>\n"); //GETで得た情報からカウントした物に+1して書き込む if ($vote===dis123){ ++$dis123; fputs($fp,"<?php $$vote=$dis123; ?>\n"); } if ($vote===dis001){ ++$dis001; fputs($fp,"<?php $$vote=$dis001; ?>\n"); } if ($vote===hoge01){ ++$hoge01; fputs($fp,"<?php $$vote=$hoge01; ?>\n"); } flock($fp,LOCK_UN); fclose($fp); echo "dis123は".$dis123."点<br>"; echo "dis001は".$dis001."点<br>"; echo "hoge01は".$hoge01."点<br>"; ?> _________________________________ 処理: counter.php?vote=dis123ときたらif処理して$dis123に+1する ________________________ 今は三つだからまだ大丈夫ですが、これが増えてくると手間が多いです そこで上記の今現在の値の書き込みとIF処理の部分を代入など、なんらかの形で簡略化できませんでしょうか?大改編になっても結構です。 よろしくお願いします。 備考:PHP暦三日目です、ここまでなんだかんだがんばったと思う。

    • ベストアンサー
    • PHP
  • foreachのなかで次のキーを参照するには

    こんばんわ, 現在PHPを学習しています。 たとえば, $hoge[0]=1; $hoge[1]=2; $hoge[2]=3; $hoge[3]=4; $hoge[4]=5; $hoge[5]=6; $hoge[6]=7; と配列があり,これをforeachで回していく際に,hogeが5になったときには,次の配列の要素である6を参照したい場合に foreach($hoge as $val){ if($val == 5){ /* $valの次の要素を見たい */ } else{ echo $val; } } をどのようにすれば,よろしいでしょうか。foreach文ではだめなのでしょうか。 nextやeachをしようしようとおもったのですが,うまくいきません。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • CSV...

    <?php $csv = "system.csv"; $array = file($csv); $c = count($array); $item = 5; //1ページの表示件数 $page = $_GET['page']; //ページ番号 $start = $page * $item; //pageが0 $matched = 0; //条件にマッチした数 foreach( $array as $i => $row ) { $row = trim( $row ); list($id[$i],$name[$i],$sex[$i],$age[$i],$stamp[$i]) = split("\,",$array[$i]); if($sex[$i] == 1 ) { if( $matched >= $start ) { echo $name[$i]; } $matched++; if( $matched - $start >= $item ) break; } } echo "登録件数:$i件"; if( $page ) echo '<a href="search_4?page=' . ( $page - 1 ) . '">前へ</a>'; else echo '前へ'; if( $i < $c ) echo '<a href="search_4?page=' . ( $page + 1 ) . '">次へ</a>'; else echo '次へ'; ?> かなりアホな質問かもしれませんが、動くかテストしようと思い 次へのリンクを押すとsearch_4?page=1となりNot Foundと表示されます。 どうしてですか?

    • ベストアンサー
    • PHP
  • ファイルの存在チェックとエンコード

    自分なりに調べてファイルの存在チェック後、filemtime順にソートを する処理を書いてみましたがいまいち自信がないので、ご教授お願いします。 後、エンコードがうまくいかないのか日本語を出力しても表示がされません。 ご指摘ご教授お願いします。 <html> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" /> <?php //ファイルの存在チェック if (file_exists('hoge01.html')) { $page['hoge1.htm'] = filemtime('hoge01.html'); } if (file_exists('hoge02.html')) { $page['hoge2.htm'] = filemtime('hoge02.html'); } if (file_exists('hoge03.html')) { $page['hoge3.htm'] = filemtime('hoge03.html'); } //ファイルが空の場合の処理 if($page == false) { echo "ファイルが存在しません。"; } //ファイルが存在すればfilemtime順にソートの処理 else{ asort($page); foreach($page as $key => $value){ echo $key; echo "<br>"; echo "<hr>"; } } ?> </html>

    • 締切済み
    • PHP
  • 繰り返し処理をうまく使えないでしょうか?

    PHP4を使用しています。 フォームで名前がchk1~chk10のまでのチェックボックスがあるとします。 そのチェックボックスにチェックが付いていた場合には1、 チェックが付いていない場合には2を書き出したいとします。 if ($chk1==1){ echo "1"; }else{ echo "2"; } if ($chk2==1){ echo "1"; }else{ echo "2"; } ・・・ とずっと記述すれば可能だと思うのですが、 それをうまく繰り返し処理を使って出来ないでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • phpのswitch文で必ずdefault処理さる

    phpでswitch文を使って変数の値に応じて処理を変えたいのですが、なぜか常にdefault処理をされてしまいます。 htmlの別ファイルから例えば"テスト,テスト2,テスト3"という文字列を受け取って strtok()を使って、$aに"テスト", $bに"テスト2", $cに"テスト3"と入るようにしました。 それで$aには"テスト"の文字列が入っているはずなので、 switch($a){ case "テスト":~~/処理 break; default:~~//処理 break; } と書いた場合、case "テスト" の処理がされるはずだと思うのですが、 なぜかdefaultの場合の処理がされてしまいます。 gettype($a); で$aの型を調べると、string型になっていおり、 $aの中身を echo "a: {$a}"; で確認すると 「a: テスト」と表示されます。 しかし、if文で if($a == "テスト"){ echo "a match テスト"; } else{ echo "not match"; } のように書いてみると、 「not match」が表示されます。 この理由が分かりません。  この理由が分かる方はいらっしゃいますか? 解決策を教えてください。 また、もしかしたら$aにはecho や print()では表示されない文字が 付属しているのかもしれないと考えていますが、 echoやprint()で表示されない文字を表示させる方法はありますか?

    • ベストアンサー
    • PHP
  • 配列を回すとき、最後の要素だけ違う処理をしたい

    hoge[0]に対して、配列の中身を処理して, 最後にカンマを付与 hoge[1]に対して、配列の中身を処理して, 最後にカンマを付与 hoge[2]に対して、配列の中身を処理して, 最後にカンマを付与 hoge[3]に対して、配列の中身を処理して, 最後にカンマを付与しない というようなことをするとき、 どう書けばよいでしょうか? for ($i = 0 ; $i <count($hoge); $i++) {   if($i< count($hoge)-1){    //配列の要素が最後じゃないのに対する処理     .",";  }else{    //配列の要素が最後のに対する処理  } } ってしたら、とりあえず、動いたのですが、 普通はどういう風に書くのでしょうか? foreachとか、あるいは、配列の最後に対してする何か 書き方ってあるのでしょうか

    • ベストアンサー
    • PHP
このQ&Aのポイント
  • PCとプリンターの設定が異なっているため、印刷画面に変更が反映されない問題が発生しています。
  • PCの設定を修正しても、プリンターの登録情報が一致していないために印刷画面が変わらない問題が発生しています。
  • EPSON社製品の設定に関する質問です。PCとプリンターの設定が異なっていても印刷画面に反映される方法を知りたいです。
回答を見る