出産前後の痔にはご注意!

初めまして、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++;
}


どうぞよろしくお願いします

このQ&Aに関連する最新のQ&A

A 回答 (4件)

んーー、とりあえず、while である必要はないと思われるのですが、


while のほうがお好みですか?

実行してないので どこかで軽くエラーとか出るかもしれませんが、以下のような感じでいかがでしょうか?

$limit = 5;
foreach($food_image as $i => $dat) {
$limit--;
$pdf->Text($x, $y, sjis_conv("$dat"));
if ($limit == 0) {
// ここに区切りを入れる処理を書いてください。
$limit = 6;
}
}
    • good
    • 1
この回答へのお礼

bm_hiro様

早速のご回答ありがとうございます。

試したところ、解決できました。
助かりました。

whileでできると思って、3日くらい思案しておりましたが
そもそもが間違いだったのですね。。

お礼日時:2010/02/04 02:49

配列を整理するというと一度次のような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_*)に慣れると便利です。
    • good
    • 1

今回の件は$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++;
}
?>
    • good
    • 0
この回答へのお礼

どうもありがとうございます

PHP初歩のときは配列の扱いをしっかりやることと
教えてもらいました、

配列を整理するということが大事なんですね。

お礼日時:2010/02/06 02:57

#1です。



> whileでできると思って、3日くらい思案しておりましたが

while でも出来る事はできるのですが、今回の場合は、配列に入っているものでしたし、foreachのほうがいいかな~。ってだけでした。
    • good
    • 0
この回答へのお礼

教えていただいて、ネットでforeachについて調べていたら
配列を扱うときはforeachでの処理が一般的だと知りました。

何分、初心者なもので、そこら辺をしっかり勉強したいと思います。

お礼日時:2010/02/04 04:02

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qforeachで回った数を表示したい

単純な質問ですみません。
====
//getTestlistは別ファイルで定義済み。
<?
$testlist=getTestlist();
foreach($testlist as $test){
?>


<? } ?>
====
例えば↑こんなふうにforeachで$testlistが存在するだけ回したとします。
そのときに何回まわったか?($testが何件あったか?)だけを表示したいのですが、そんなことってできますか?
表示したい位置は<? } ?>の外側にと考えています。
あさってな質問でしたらすみません。
phpVer 4.3

よろしくお願いいたします。

Aベストアンサー

<?
$testlist=getTestlist();
$n=0;
foreach($testlist as $test){
$n++;
?>
<?}?>

<?=$n?>回
とかでよいかと思います。

途中でbreakなどが無ければ
<? echo count($testlist) ?>でも良いかも知れません。

Qillegal string offset

php5.3では動いていたプログラムをphp 5.4 で動かしたらwarning illegal string offsetが出て困っています。以下のプログラムでwarningが出ないようにするにはどのようにコーディングすればよいのでしょうか?


$a = array('exists' => 'foo');
if ($a['exists']['non_existent']) {
print 1;
}
print 2;
exit;

Aベストアンサー

isset()を使えばいいと思います

Q宜しくお願いします。

宜しくお願いします。
mix~max値の間、発行したクエリーからの値を配列に入れたいのですが、どうもFor文中にmin,max値は届いているのですが,$resultに値が入りません。
エラーからしてSQLで行っている変数処理に$iの値が届いてない感じがするのですが、下記のソースを見て頂いて、疑わしき点などご指摘、ご教授いただけませんでしょうか。

どうぞ宜しくお願いします。


--エラー文ここから--->
Catchable fatal error: Object of class stdClass could not be converted to string in ...




--ソースここから--->

$min = h($r -> x);
$max = h($s -> y);
for($i=$min ; $i<= $max; $i++){
$search = sprintf("SELECT id FROM Sheet WHERE no='%d'",$i);
$q_search = mysql_query($search);
$result = mysql_fetch_object($q_search);
echo $result;
}

宜しくお願いします。
mix~max値の間、発行したクエリーからの値を配列に入れたいのですが、どうもFor文中にmin,max値は届いているのですが,$resultに値が入りません。
エラーからしてSQLで行っている変数処理に$iの値が届いてない感じがするのですが、下記のソースを見て頂いて、疑わしき点などご指摘、ご教授いただけませんでしょうか。

どうぞ宜しくお願いします。


--エラー文ここから--->
Catchable fatal error: Object of class stdClass could not be converted to string in ...




--ソースここから...続きを読む

Aベストアンサー

PHPあまり詳しくないので間違っていたらすいません。


>$result = mysql_fetch_object($q_search);
でresultはobject型で代入しておりそれを表示するときにString型に変換できていないのが原因かとおもわれます。

参考URL
mysql-query
http://php.net/manual/ja/function.mysql-query.php

mysql-fetch-array
http://php.net/manual/ja/function.mysql-fetch-array.php

mysql_fetch_object
http://phpspot.net/php/man/php/function.mysql-fetch-object.html

QPHPで偶数と奇数を判断するには

宜しくお願いします。
一覧表示等をする時に見やすいように一行ずつテーブルの色を変えたりすると思うのですが、これをPHPのfor文で自動的に交互に色を変えるようなプログラムを作ろうと思っております。for文で繰り返し処理場合、例えば、

for($n = 0; $n < 100; $n++)
{
 if($n = 偶数)
 {
 $bgcolor = "#ff0000";
 }
 elseif($n = 奇数)
 {
 $bgcolor = "#0000ff";
 }
}

といった形で交互に色を変るには、偶数/奇数の判断が出来ないと無理だと思うのですが、何か良い方法は無いでしょうか?

Aベストアンサー

if($n % 2 == 0) {
 偶数の処理;
} else {
 奇数の処理;
}

%は、割り算をした、余りです。
例)
3を2で割った余りは1
4を2で割った余りは0 

ANDで求める方法もあります。

またこの場合は、一度偶数で判定すれば、奇数の判定は不要です。

Q文字列から、特定の文字を削除したい

アンケートで入力された値を受け取り、メールで送信しているのですが、受け取った値から、特定の文字列を削除することは可能でしょうか?

例えば電話番号の入力の場合、
03-xxxx-xxxx →03xxxxxxxx
077-xxx-xxxx →077xxxxxxx
のように、-(ハイフン)が入力されていたら、-を削除した文字列に置換してメール送信したいのです。
入力する時に、3つのテキストエリアに分けるのは諸事情でできないので、特定の文字を削除する関数か処理方法がありましたら、教えていただきたいです。
よろしくお願いします。

Aベストアンサー

str_replace
http://itbtech.itboost.co.jp/man/php_man/function.str-replace.html

<?php
$orig_telno = "03-xxxx-xxxx";

$telno = str_replace("-", "", $orig_telno);
echo $telno;

03xxxxxxxx

“PHP 文字列” あたりをキーワードに検索すれば
そんなに難しいものでもないような。

Qページ移動した場合の、フォームデータの保持

PHP初心者です。

私が作っているPHPのシステムで、ユーザーがフォームデータ入力途中に、他のページに移動すると、「戻る」ボタンなどですぐに戻ってきても、入力したフォームデータが消えてしまいます。

例えば、この「教えてgoo」の「新しい質問をする」のフォームはPHPで生成されていますが、

http://oshiete1.goo.ne.jp/oshiete_new.php3?c=256

途中でちょっと他のページに行っても、(すぐ戻れば?)入力したデータは保持されますよね。

こんなふうにしたいのですが、どうすればよいでしょうか?
「戻る」ボタンで戻ったときに、サーバーから毎回新しいXHTMLをロードしてくるので、入力データがクリアされてしまうのでしょうか?

フォーム入力⇒確認画面⇒「戻る」ボタンで戻るとフォームデータが保持されないということではなく、あくまでフォーム入力中に、ちょっと他のページに行って戻ってくるという設定です。

よろしくお願いします。

Aベストアンサー

原因はセッション関連にありそうですね。
session_cache_limiter()
というのは指定されていますか?
恐らく現状はnocache(ページ内容をキャッシュしない状態)になっているのだと思います。

もし
session_cache_limiter('nocache');
となっていれば、publicもしくはprivateへ変更してみて下さい。
ないようでしたら、session_start()の前に
session_cache_limiter('public');
session_cache_limiter('private');
のどちらかを記述してみて下さい。
publicだと、クライアントマシン、プロキシのどちらもキャッシュを保持しますが、
privateだとクライアントマシンのみキャッシュを保持します。
どちらが良いのかは使い方によると思いますし、
nocacheでないと困る時もありますから。

session_startを削除してしまって良いかどうかは、
他の部分の処理との関連が分からないので何とも言えないです。

一度試してみて下さい。

参考URL:http://jp.php.net/session_cache_limiter

原因はセッション関連にありそうですね。
session_cache_limiter()
というのは指定されていますか?
恐らく現状はnocache(ページ内容をキャッシュしない状態)になっているのだと思います。

もし
session_cache_limiter('nocache');
となっていれば、publicもしくはprivateへ変更してみて下さい。
ないようでしたら、session_start()の前に
session_cache_limiter('public');
session_cache_limiter('private');
のどちらかを記述してみて下さい。
publicだと、クライアントマシン、プロキシのどち...続きを読む

QボタンをクリックでPHP文を実行

ボタンをクリックしたときのみPHP文を実行したいのですが・・・

<input type="button" onClink="<?php~?>">
でいけるかと思ったのですが、
ページ表示時に<?php~?>が実行されてしまい、うまくいきませんでした。

onClink="window.open(test.php)"
という方法以外でお願いします。

Aベストアンサー

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、遷移させることが大前提で動作します

ですから、ボタンを押してその場でJavaScriptと同じようにPHPが動くなんてことはありえません。
ボタンを押したらサーバーにリクエストする という動作ならば可能です。

つまり
質問で言われているような
onClink="window.open(test.php)"

<form name="f1" action="test.php" method="post">
<input type="submit" name="submit" value="submit" />
</form>
等のような形になります

こういった一般的な方法だと いちいち画面が切り替わったようになってしまうのを嫌って Ajaxでコレと同じことを、画面を切り替えずに行っているだけに過ぎません

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、...続きを読む

Qphpのfor文の中で配列を作りたいです。

$a = array();
$a[0]="あ";
$a[1]="";
$a[2]="い";
$a[3]="";
$a[4]="";
$a[5]="う";

のような配列がありfor文の中で文字列が一文字以上だったら配列$bに入れるということをしたいのですが、

$b=array();
for($i=0; $i<count($a); $i++){

$c = mb_strlen($a[$i]);
if($c>=1){
$b = $a[$i];
}
}
var_dump($b);

とすると$bには最後の”う”しか入りません。

$bを

$b[0]="あ";
$b[1]="い";
$b[2]="う";

とするようにするにはどうしたらいいですか?

Aベストアンサー

$b[] = $a[$i];

QPHPで10連ガチャを作成したいのですが

PHPで10連ガチャを作成したいのですが
どのように組めばいいのかわかりません。
現在、以下のとおりプログラムを作成しておりまして
ここからどのように作成していけばいいのかわからず
悩んでいます。
PHPに詳しい方、ご解答していただければ幸いです。
<?php
//配列の中身
$gacha = array(
'C' => 20,
'UC' => 40,
'R' => 60,
'SR' => 80,
'UR' => 100,
);
//$keyをランダムに表示させる
$rand = mt_rand(1,100);
foreach($gacha as $key =>$val){
if($rand <= $val){
echo $key;
break;
}
}

Aベストアンサー

なるほど、ではこんな感じでどうでしょう?

<?PHP
$gacha = array_fill(0,20,'C');
$gacha = array_merge($gacha,array_fill(20,20,'UC'));
$gacha = array_merge($gacha,array_fill(40,20,'R'));
$gacha = array_merge($gacha,array_fill(60,20,'SR'));
$gacha = array_merge($gacha,array_fill(80,20,'UR'));
shuffle($gacha);
for($i=0;$i<10;$i++){
print $gacha[$i]."<br>";
}
?>

QリンクでPOSTデータを送信することは可能ですか?

はじめまして。
Submitボタンを使用せずに<A>リンクでFORMのPOSTメソッドデータを送信することは可能でしょうか?
やはりURLにデータを付加して送信するしかないのでしょうか?
ご教授よろしくお願い致します。

Aベストアンサー

javascript を使えば可能です。大雑把にはこんな感じ。

・パラメータが全部 hidden な form を記述しておく(ブラウザでは表示されない)
・<a href> では、その form を submit するように javascript を記述する

試してないですけど、こんな感じ。

<form name=f method=POST action="http://どこか">
<input type=hidden name=x1 value=v1>
</form>

<a href="javascript:document.f.submit()">リンクから submit</a>


人気Q&Aランキング