人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPで次のプログラムを作成してください。

配列を使ったユーザー定義関数を作成する時、
処理を行ってる配列要素をechoするというスクリプトを作成してください。
下記に配列とユーザー定義関数を用意していますが、
実際に使用する関数はもっとずっと複雑で大量です。

$u = array('a','b','c','d','e');
function xxxx($m){
foreach($m as $o){
$t .= $o;
}
return $t;
}
echo xxxx($u);

上記のスクリプトで
aの処理が終了した時点で、aをecho。
bの処理が終了した時点で、aのechoを消し、bをechoするということです。
現在、どの要素の処理をしているのか確認することを目的としています。
上記のスクリプトだと一瞬で終わってしまいますが、
意図を汲んで作成していただけると幸いです。

Vista,PHP5,XAMPP,Firefoxという環境でやっています。
以上、よろしくお願いします。

●質問者: taroemon
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:AS echo firefox PHP VISTA
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● kn1967
●100ポイント
// 関数宣言
function xxxx($m){
 foreach($m as $o){
 // 開始をecho
 echo "$o";
 // echoを即時反映するための処置(出力バッファから即時出力するように指示)
 ob_flush();
 flush();
 $t .= $o;
 // 処理しているつもりで1秒待つsleep
 sleep(1);
 }
 return $t;
}

// メイン処理
$u = array('a','b','c','d','e');
echo xxxx($u);

ループの中でechoを順次出力すれば良いのは理解しておられると思いますが

そこでのミソは

 ob_flush();
 flush();

という処置です。


phpやwebサーバなどは1文字単位で出力するのではなく

出力がある程度溜まるまで出力用バッファに貯めます。

それを強制的に吐き出させるのが上記の2行です。

上記の2行が在る場合と無い場合で実験してみれば目で確認できますよ。


なお、バッファの強制出力は、

今回のような要望や、時間がかかる処理のために

ブラウザ側が接続タイムアウトを返してしまう場合などに有効な手段ですが

出力するという手間な動作の回数を減らして負荷を下げ

高速化を図るというバッファの主旨に反する行為でもありますので

むやみやたらとは使わないようにしてください。


余談ですが、関数などは先に書くのが常道です。

(コンパイルが若干早くなるといったような事は

最近のコンピュータでは些細で微妙な話なのですが

自分でコードを見る際に、上から下に見ていけば済むので便利ですよ)

◎質問者からの返答

いつも大変お世話になっています。


のぞみどおりうまくいきました。

また、丁寧な解説ありがとうございます。

実はバッファ関連はあまり理解できてなかったので、とても参考になりました。


>バッファの強制出力は、(中略)むやみやたらとは使わないようにしてください。

>余談ですが、関数などは先に書くのが常道です。

私は独学でPHPの勉強をしていますので、

こうしたことを教えていただけるのは本当に勉強になりますし、

またそれが励みにもなります。ありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ