PHP初心者のためのwhileループの回数指定方法とは?

このQ&Aのポイント
  • PHP初心者の方におすすめの、whileループの回数を指定する方法について解説します。
  • 配列の要素ごとに区切りつける方法や、特定の回数ごとに区切る方法を紹介します。
  • 初心者でも分かりやすい具体的なコード例を示しながら、 whileループの回数を指定する方法を説明します。
回答を見る
  • ベストアンサー

PHP初心者です whileの回数を指定 について

初めまして、PHP初心者です。whileについての質問です whileでループ中に指定する数ごとに区切りつけたいと思っています。最初は5回目、残りは6回毎に区切る方法はありますか? $food_image[] = a: $food_image[] = b: $food_image[] = c: $food_image[] = d: $food_image[] = e: $food_image[] = f: $food_image[] = g: ...配列は50個くらいまで続きます… $food_count = count($food_image); $i = 1; while( $i <= $food_count ){ $pdf->Text($x, $y, sjis_conv("$food_image[$i] ")); $i++; } どうぞよろしくお願いします

  • PHP
  • 回答数4
  • ありがとう数4

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

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

んーー、とりあえず、while である必要はないと思われるのですが、 while のほうがお好みですか? 実行してないので どこかで軽くエラーとか出るかもしれませんが、以下のような感じでいかがでしょうか? $limit = 5; foreach($food_image as $i => $dat) { $limit--; $pdf->Text($x, $y, sjis_conv("$dat")); if ($limit == 0) { // ここに区切りを入れる処理を書いてください。 $limit = 6; } }

shanchan
質問者

お礼

bm_hiro様 早速のご回答ありがとうございます。 試したところ、解決できました。 助かりました。 whileでできると思って、3日くらい思案しておりましたが そもそもが間違いだったのですね。。

その他の回答 (3)

  • yuuki0229
  • ベストアンサー率70% (33/47)
回答No.4

配列を整理するというと一度次のような2次元配列に変換してしまう方法もあります。 そこから2重ループで好きに処理すれば良いわけです。 $result = array(  array(a,b,c,d,e),  // 5件  array(f,g,h,i,j,k), // 6件  array(l,n,m,o,p,q), // 6件  … ); <?php $data = array(); for($i=1; $i<=50; $i++) { $data[] = "ダミーデータ{$i}"; } $top5 = array_splice($data, 0, 5); // 先頭5件を切り出す $result = array_chunk($data, 6); // 残りを6件ずつに分割(2次元配列) array_unshift($result, $top5); // 先頭に挿入 print_r($result); >PHP初歩のときは配列の扱いをしっかりやることと >教えてもらいました 上記のように配列関数(array_*)に慣れると便利です。

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

今回の件は$food_imageのキーが0から始まる整数であることが 自明ですが、配列の場合必ずしもそうであるわけではありません。 whileでカウンタをインクリメントする場合は、条件を合わせるために array_keys()やarray_values()で一度配列を整理した方がよいでしょう。 すでに回答はでているとおりforeachでやるのが賢明だという 前提で、もしwhileでやるならこんな感じ <? $food_image= Array("a"=>"x","b"=>"y","c"=>"z"); $food_values = array_values($food_image); $i = 0; while( true ){ if(isset($food_values[$i])===false) break; print $food_values[$i]; $i++; } ?>

shanchan
質問者

お礼

どうもありがとうございます PHP初歩のときは配列の扱いをしっかりやることと 教えてもらいました、 配列を整理するということが大事なんですね。

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

#1です。 > whileでできると思って、3日くらい思案しておりましたが while でも出来る事はできるのですが、今回の場合は、配列に入っているものでしたし、foreachのほうがいいかな~。ってだけでした。

shanchan
質問者

お礼

教えていただいて、ネットでforeachについて調べていたら 配列を扱うときはforeachでの処理が一般的だと知りました。 何分、初心者なもので、そこら辺をしっかり勉強したいと思います。

関連するQ&A

  • PHPのループ数限界値について

    PHPのループ数限界値について 宜しくお願い致します。PHP 5.1.6を使用しております。 PHPのforやwhileのループ処理について、限界のループ数というのは存在するのでしょうか? 今作っているプログラムで、約15,000項目の配列と約10,000項目の配列で2重のループ処理しています。 この場合のループ数は15,000×10,000=150,000,000回の繰り返し回数となってしまいます。 しかも、この配列数は今後も増える可能性が高いです。 ループの限界値が何回なのか、教えてください。

    • ベストアンサー
    • PHP
  • do - while 文

    以下のコードをコンパイル後実行すると、0~9までの出現回数がわかるのですが、処理を続けますか?と出た後yを入力するともう一度 do 以降を実行するようにしたいのですが、yを入力する前にプログラムが終了してしまいます。何がいけないんでしょうか? #include <iostream> using namespace std; int main (void) { int i; char cont; char c; int count[10] = {0}; do{ while (cin.get(c)){ switch (c){ case '0': count[0]++; break; case '1': count[1]++; break; case '2': count[2]++; break; case '3': count[3]++; break; case '4': count[4]++; break; case '5': count[5]++; break; case '6': count[6]++; break; case '7': count[7]++; break; case '8': count[8]++; break; case '9': count[9]++; break; } } for (i =0; i < 10; i++) cout << i << "の出現回数は" << count[i] << "\n"; cout <<"処理を続けますか?(y/N)"; cin >>cont; }while (cont == 'y'); }

  • do-while文について

    参考書を読んでいて分からないところが有りました。 「配列aの値を先頭から見ていき、その値が-1になるま配列bにコピーしていく。そのとき-1という値もコピーする。という処理をするものです。-1という値もコピーするため、このループは最低1回は実行されることになります。 i=0; do{ b[i]=a[i]; }while(b[i++]!=-1); 」 この場合、a[0]が-1のときにはb[0]に-1がコピーされるかもしれませんが、そうでない場合は「そのとき-1という値もコピーする。」というのは出来ないと思うのですが、どなたかご教授宜しくお願いします。

  • 配列生成される限り、ループしたい

    function arrayxml (){ urlで取得したXMLから、配列を取得 return $hairetu; //戻り値は多次元配列 } $data = arrayxml(); $cnt = count($data); do { for ($i=0; $i < $cnt; $i++) { $data = arrayxml($data[$i][0]); } } while (count($data) > 0); //関数によって配列が作られる限り このスクリプトではループはうまくされません。 $data = arrayxml($data[$i][0]);を--->arrayxml($data[$i][0]);にすると $cnt分ループされますが、do~whileのループはなされません。 関数で配列が生成される限り、do~whileループをさせたいのですが正しい方法を教えていただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPループをカウントダウンできますか?

    <?php $i = 0; while ($i < 10) {   if ($i == 5) {    echo "$i 回で終わります<br>";    break;   }   echo "$i 回目のループ<br>";   $i++; } 【結果】 0 回目のループ 1 回目のループ 2 回目のループ 3 回目のループ 4 回目のループ 5 回で終わります と、0,1,2,3,4,5とループがありますが、 この結果を逆に、 5 回で終わります 4 回目のループ 3 回目のループ 2 回目のループ 1 回目のループ 0 回目のループ とすることは可能でしょうか?? また、もし可能であれば、なんという方法(名称?専門的な呼び方?)となるのでしょうか ご存じの方いらっしゃいましたら、ご回答お願い致します。

    • ベストアンサー
    • PHP
  • PHP 配列の添字に変数は使えない?

    phpで初歩的な質問ですが、foreachでループしてる間 配列にどんどん文字を入れたいと思います。 $i = 0 ; foreach($entry as $no){ $sort[\'$i\'] = \"hogehoge\" ; $i++; } イメージは↑こんな感じにしたいのですが、配列の添字に変数は 使えないようなことが書いてありました。 こういう動きをする場合にはどうすれば良いのでしょうか? ご教授よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • php初心者です。宜しくお願い致します。

    php初心者です。宜しくお願い致します。 動作環境はwindowsXPです。 windows上に配置された日本語のファイル名を持つファイルをphpから処理したいと思っています。 たとえば、 if (!file_exists(mb_convert_encoding($path_file,"SJIS","auto"))) {・・・というようにまずファイル存在チェックを行うなど。 上記例では$path_fileはUTF-8で格納しているため、windowsに合わせSJISにエンコーディングしています。 $path_fileにはフルパスを指定し、大抵の日本語ファイルは読み込めるのですが、いわゆる5C問題に該当する、「表紙.pdf」「予定.txt」など、特定文字を含む日本語ファイル名が読めません。上記file_existsを行うと、存在するのに「存在しない」と判定されてしまいます。 不思議なのは、scandirして指定フォルダ内全てのファイル名を一括取得し配列へSJISで格納した後、そのまま配列の値をもってfile_existsしてみると、上記特定文字を含む日本語ファイル名だけ「存在しない」と判定されてしまいます。 ちなみにscandirした結果をUTF8に変換しブラウザに表示させてみると「表紙.pdf」「予定.txt」と正しく表示され、「表\紙.pdf」「侮・.pdf」等のように化けないです。 php.iniの「magic_quotes_gpc」はOffとなっています。 file_existsだけでなく、fopen、readfileなど含め、正しく処理できるようにするためにはどうすればよいのでしょうか、ご教授いただけると幸いです。

    • 締切済み
    • PHP
  • whileで最後のループを判別するには?

    環境:php5 Q. DBから取得した値をwhileでループさせたとき、最後のループを取得するにはどうしたらいいのでしょうか? 現状ではループさせる数を最初に取得して、whileさせているときに$i++でカウントさせながら、合計の数とイコールになったときに最後と判断させていますが、もっとスマートに記述する方法などはあるのでしょうか? smartyだとlastで取得できるみたいですけど。 ご教授いただけると幸いです。

    • 締切済み
    • PHP
  • UTF8のPHPにSJISのPHPを組みこむ方法?

    charset=UTF-8で動作するPHPファイルがあります。 ****************** UTF-8で動作するPHP ****************** <?php ・・・・・・・・ header("Content-type:text/html;charset=UTF-8"); ?> <html lang="ja"> <head> <meta http-equiv="content-type" content="text/html; UTF-8"> <title><?=$API_NAME?></title> </head> ・・・・・・・・・・ ・・・・・・・・・・ </html> のような形です。 一方、SJISで動作する下記のPHPがあります。 このS_JIS PHPを上記のUTF-8PHPの中の</head>と</html>の間に組み込みたいと思います。 下記のPHPは、data.csvからファイルの中身を表示させるPHPですが、そのまま放り込むと 文字化けしてしまいます。 (下記のPHP単体だと正しく表示されます。charset=UTF-8下で文字化けします) data.csvの文字コードをUTF-8にする。LF にするなど試してみましたが文字化けしたままでした。 また、#include <string.h>の下に mb_convert_encoding($string, 'utf8', 'sjis'); を入れてみましたが文字化けは直りませんでした。 お手数ですが下記のPHPをUTF8上で正しく表示させる方法が分かりましたらご教授願います。 ****************** SJISで動作するPHP ****************** <? #include <string.h> // CSV ファイルを読み込み、$data配列に格納 $handle = fopen("data.csv", "r"); while (($row = fgetcsv($handle, 1000, ",")) !== FALSE) { if ( strcmp( $row[0] , '110' ) == 0 ) { $data[] = array( 'shop'=>$row[0] ,'priceA'=>$row[1], 'priceB'=>$row[2], 'place'=>$row[3] ); } } fclose($handle); // 列方向の配列を得る foreach ($data as $key => $row) { $shop[$key] = $row['shop']; $priceA[$key] = $row['priceA']; $priceB[$key] = $row['priceB']; $place[$key] = $row['place']; } // 結果の表示 for( $i=0 ; $i<count( $data ) ; $i++ ) { print "$shop[$i] $priceA[$i] $priceB[$i] $place[$i]<br>\n"; } ?>

    • ベストアンサー
    • PHP
  • 「ようこそ○○様」をPHPで出力するためには

    下記スクリプトを実行しても反映されません。 エラーが数個出てしまいます。非力ながら訂正をしますが、動きません。 下記の場合何を変更すればよろしいでしょうか。 .恐れ入りますがご指導頂ければ幸いでございます。 <?php session_set_cookie_params(50000,$_SERVER['PHP_SELF']); session_start(); $_SESSION["vars"]; $pagetitle="Travel Route planner"; $id=$_COOKIE['PHPSESSID']; if($id==""){ //初回の処理 $mode="init"; $vars['count']=0; }else{ //二回目以降の処理 $mode="normal"; $x=$_POST['map_x']; //x座標 $y=$_POST['map_y'];//y座標 if($x && $y){ if(($x>466 && $x<518)&&($y>475 && $y<501)){ $_SESSION['vars']['count']=0; }else{ //座標を保存 $namex=sprintf("xpos%d",$_SESSION['vars']['count']); $namey=sprintf("ypos%d",$_SESSION['vars']['count']); $townname=sprintf("townname%d",$_SESSION['vars']['count']); $_SESSION['vars'][$namex]=$_POST['map_x']; $_SESSION['vars'][$namey]=$_POST['map_y']; $_SESSION['vars'][$townname]=$_POST['townname']; $_SESSION['vars']['count']++; } } //名前の処理 if(isset($_POST['cmd'])=="登録"){ if($_POST['username']==""){ $_SESSION['vars']['username']="[Unknown]"; }else{ $_SESSION['vars']['username']=$_POST['username']; } } //image.phpにわたす $param="?count={$_SESSION['vars']['count']}&"; $param.="username={$_SESSION['vars']['username']}&"; for($i=0;$i<$_SESSION['vars']['count'];$i++){ $namex=sprintf("xpos%d",$i); $namey=sprintf("ypos%d",$i); $townname=sprintf("townname%d",$i); $str=sprintf("%s=%s&%s=%s&%s=%s&", $namex,$_SESSION['vars'][$namex], $namey,$_SESSION['vars'][$namey], $townname,$_SESSION['vars'][$townname]); $param.=$str; } //ユーザー名付加 $pagetitle.=" for {$_SESSION['vars']['username']}"; } ?> <!DO..省略.> <form action="<?php echo"{$_SERVER['PHP_SELF']}";?>" method="POST"> 名前<input type="text" name="username"> <input type="submit" name="cmd" value="登録"> </form> .. .. </body> <?php endif;?> <?php if($mode=="normal"):?> <head><title><?php echo"$pagetitle";?></title></head> <form action="<?php echo"{$_SERVER['PHP_SELF']}";?>" method="POST"> <input type="text" name="townname"> <input type="image" src="./image.php<?php echo"$param";?>" name="map"> .. </html> お願い申し上げます。

    • 締切済み
    • PHP

専門家に質問してみよう