トップページ⇒php
1001コメント320KB

【PHP】質問スレッドpart17【php】

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/05/17 17:14ID:AT+bUkag
・PHP全般の質問スレです。
・新規質問の方は上げてください。age進行でお願いします。
・質問する際には環境も明記。
・正しい日本語で分かりやすく。
・レスがつかないからって逆切れする厨お断り。
・解決しなくてもこたえてもらったら礼を。


■本家
 http://www.php.net/

■日本 PHP ユーザ会
 http://www.php.gr.jp/

■PHP マニュアル
 http://www.php.net/manual/ja/

■PEAR マニュアル
 http://pear.php.net/manual/ja/

過去スレ, 関連スレ等>>2-4


抜けているものがあったら補足願います
0237nobodyさん04/05/25 15:15ID:???
>>234
試してみると大分違う。

require_once 'Benchmark/Timer.php';
$leftarrow = '>';
$str1 = $str2 = $str3 = $leftarrow;
$arr1 = $arr2 = $arr3 = array();

for ($i = 0; $i < 2000; ++$i) {
  $arr1[] = 'a' . str_pad($i, 5, '0', STR_PAD_LEFT);
  $arr2[] = 'a' . str_pad($i, 5, '0', STR_PAD_LEFT);
  $arr3[] = 'a' . str_pad($i, 5, '0', STR_PAD_LEFT);
}

$timer =& new Benchmark_Timer();
$timer->start();

$timer->setMarker("Benchmark for 'foreach'");
foreach ($arr1 as $key => $value) {
  $arr1[$key] = $str1.$value;
  $str1 .= $leftarrow;
}
$timer->setMarker("Benchmark for 'for'");
$max = count($arr2);
for ($i = 0; $i < $max; ++$i) {
  $arr2[$i] = $str2.$arr2[$i];
  $str2 .= $leftarrow;
}
0238nobodyさん04/05/25 15:15ID:???
reset($arr3);
$timer->setMarker("Benchmark for 'while--list-each'");
while (list($key, $value) = each($arr3)) {
  $arr3[$key] = $str3.$value;
  $str3 .= $leftarrow;
}
$timer->stop();
echo $timer->getOutput();
結果
--------------------------------------------------------------
marker time index    ex time      perct
--------------------------------------------------------------
Start 1085465264.67439000 -      0.00%
--------------------------------------------------------------
'foreach' 1085465264.67453300 0.00014281272888184 0.01%
--------------------------------------------------------------
'for' 1085465264.70273000 0.028197050094604 2.24%
--------------------------------------------------------------
'while--list-each' 1085465265.05475400 0.35202407836914 27.93%
--------------------------------------------------------------
Stop 1085465265.93488100 0.880126953125 69.82%
--------------------------------------------------------------
total - 1.2604908943176
0239nobodyさん04/05/25 15:19ID:???
結果
--------------------------------------------------------------
ずれてたので
marker       time index     ex time       perct
--------------------------------------------------------------
Start       1085465264.67439000 -          0.00%
--------------------------------------------------------------
'foreach'     1085465264.67453300 0.00014281272888184 0.01%
--------------------------------------------------------------
'for'       1085465264.70273000 0.028197050094604  2.24%
--------------------------------------------------------------
'while--list-each' 1085465265.05475400 0.35202407836914  27.93%
--------------------------------------------------------------
Stop        1085465265.93488100 0.880126953125   69.82%
--------------------------------------------------------------
total       -          1.2604908943176   100.00%
--------------------------------------------------------------
0240nobodyさん04/05/25 15:22ID:???
何度もすまん

02.24% foreach
27.93% for
69.82% while(list() = each())

ってことで、10倍以上の差が出る。
0241nobodyさん04/05/25 15:26ID:???
思ってたよりも明確に差が出てて驚き
0242nobodyさん04/05/25 15:28ID:???
>>237-239
どっちが速いの?
0243nobodyさん04/05/25 15:28ID:???
勉強になった
ありがとう
0244nobodyさん04/05/25 15:36ID:???
$max = count($arr2);
for ($i = 0; $i < $max; ++$i) {
  $arr2[$i] = $str2.$arr2[$i];
  $str2 .= $leftarrow;
}
の部分だけど、>>199はfor文内でcountを使ってたから
もっと遅くなっていただろうな。
0245nobodyさん04/05/25 15:39ID:???
逆にforを使ったほうが早くなるようなケースってあるだろうか
0246nobodyさん04/05/25 15:45ID:???
ごめん、数値の見方わかんないんだけどforeachが一番早かったってことだよね
0247nobodyさん04/05/25 15:47ID:???
perctの%は掛かった時間なのかな

whileやforの条件チェックよりも、foreachの配列チェックの方が早いんだね。
whileはlistかeachのどっちかがボトルネックなのかな
0248nobodyさん04/05/25 15:57ID:???
単純なコードの2000回のループでもこんだけ差が出るんだな
俺もこれからまめにベンチとってみよう
0249nobodyさん04/05/25 16:03ID:???
よくわからんけど、コレ置いときますね。
<?php
require_once 'Benchmark/Timer.php';
$timer =& new Benchmark_Timer();
$timer->start();
$timer->setMarker("Benchmark for 'for'");
for ($i=0; $i<10000; $i++)
loop_for();
$timer->setMarker("Benchmark for 'forearch'");
for ($i=0; $i<10000; $i++)
loop_foreach();
$timer->stop();
echo $timer->getOutput();
function loop_for()
{
$arr = array('食べ物', '野菜', 'ワイルド系', 'キャベツ');
for ($i=0; $i<count($arr); $i++)
$arr[$i] = str_repeat('>', $i+1).$arr[$i];
unset($arr);
}
function loop_foreach()
{
$slash = "<";
$str = $slash;
$arr = array("食べ物", "野菜", "ワイルド系", "キャベツ");
foreach($arr as $key => $value):
$arr[$key] = $str.$value;
$str .= $slash;
endforeach;
unset($arr);
}
?>
0250nobodyさん04/05/25 16:11ID:???
>>240
ウチの結果だと
36.58%
24.29%
39.07%
でforが最速と出たんだがwwww
0251nobodyさん04/05/25 16:18ID:???
>>247
>※関数を使うプログラムより関数を使わないプログラムの方が優秀である。
一部の香具師によって、否定されていたがある意味正解。
whileはループでは条件判定だけだから
ループ処理では最速なんだろうけど、これが配列になると
キーが関係してくるから結果的に色々な関数を扱わざるおえない。
foreachを使った方がいいって事なんだろう。
whileは、私は代入ぐらいに使おうと思います。
やっぱりfor()は初心者向きだよな。分かりやすいけど。
0252nobodyさん04/05/25 16:19ID:???
ウチの環境
foreach  0.07%
for     32.69%
while    25.84%

違うねー
0253nobodyさん04/05/25 16:21ID:???
カポコンファンに転職
0254nobodyさん04/05/25 16:24ID:???
つーかさ、あれだよ、速さが気になるならPHP選ぶな、と
0255nobodyさん04/05/25 16:27ID:???
あーC言語っぽい書き方だね、とてもPHPやってますっていう
スクリプトじゃない。本物ならこう書くだろう。
0256nobodyさん04/05/25 16:28ID:???
経験よりも才能。いじょ。
0257nobodyさん04/05/25 16:28ID:???
じゃー僕以上のスクリプト書いてもらえます?
自分には才能以外の要素は無いんで。
0258nobodyさん04/05/25 16:30ID:???
>>252
それ読み方違うっての
32.69% foreach
25.84% for
だ

お前らちゃんと試してから語れよ?
0259nobodyさん04/05/25 16:30ID:???
horeta(・∀・)!!
0260nobodyさん04/05/25 16:32ID:???
>>252
総和が100%になってないねー
0261nobodyさん04/05/25 16:35ID:???
>>260
Stopが含まれてないYO!
シッカリ前文を読め!!
0262nobodyさん04/05/25 16:36ID:???
本物ならこう書くだろう。
026324004/05/25 16:38ID:???
>250

ん、こっちは、
PHP 5.0.0RC3-dev (cli)
で試したんでそのせいだった。

改めて
PHP 4.3.6 (cli)での結果

Benchmark for 'foreach'
33.01%
Benchmark for 'for'
35.14%
Benchmark for 'while--list-each'
31.75%
0264nobodyさん04/05/25 16:40ID:???
あんまかわんないね
0265nobodyさん04/05/25 16:41ID:???
                配列    代入  組んでる奴が素人時
PHPユーザー(神レベル) foreach() while()   for()
PHPユーザー(パンピーレベル)while()  while()   while()
でOKでつね。
0266nobodyさん04/05/25 16:50ID:???
結局カポコンのスクリプトは言う程速くなかったってことでFA?
0267nobodyさん04/05/25 17:00ID:???
ベンチとってる方々へ。
count() を使うなら、せめて配列をリファレンスで渡してください。
でないとものすごく遅くなるよ。
0268nobodyさん04/05/25 17:04ID:???
>>267
ループの外なら変わらんだろ
基本がなってないね
0269nobodyさん04/05/25 18:08ID:???
>>237-238と同じソースにて
Win 2000・PHP 4.3.4・apache 2.0.48 環境で

Benchmark for 'foreach'
38.63%
Benchmark for 'for'
25.19%
Benchmark for 'while--list-each'
36.09%
0270nobodyさん04/05/25 18:17ID:???
win2000 php4.3.4 anhttpdでPHPを動かしてるんですが
たまにエラーがでてサーバーが落ちてしまいます。
直す方法あるでしょうか。
0271nobodyさん04/05/25 18:25ID:???
テキストファイルから読み込んだデータをphpで一覧表示しているのですが、
チェックボックスにチェックが入ったもの全てを削除というのがなかなか出来ません。
log.txtの中身
118,ベッカム
119,シェフチェンコ
120,ロナウド

del_info.phpの中
print "<form method=\"POST\" action=\"delete.php\" target=\"index\">";
print "<table border=\"0\">\n";
for ($i = 0; $i < count($id); $i++)
{
print "<tr><td>\n";
print "<input type=\"checkbox\" name=\"check[]\" value=\"$id[$i]\"></input>";
print "</td><td>$id[$i]\n";
print "</td><td>$name[$i]\n";
print "</td></tr>";
}
print "<tr><td><input type=\"submit\" name=\"line_del\" value=\"削除\"></td>";
print "</table></form>\n";

delete.phpにどんなソースを書けばよいでしょうか?
0272nobodyさん04/05/25 18:29ID:???
log.txt全体を読み込んで一件ずつlog.txtへ書き出す
その際にチェックが入っているレコードを書き出さないようにする
0273nobodyさん04/05/25 18:34ID:???
早速の返信ありがとうございますが、出来れば削除したいんです
0274nobodyさん04/05/25 18:35ID:???
ああ、なるほど。そのやり方で削除できますね。
0275nobodyさん04/05/25 18:37ID:???
>>270
Use the source, Luke!
anhttpdは知らん。バージョンも書いてないし。
027626904/05/25 18:41ID:???
色々コード変えてやってみたけど同条件下ではうちの環境だと
foreach≒whileでやっぱりforが一番速い
あとstr_repeatにしてもほぼ変わらないかむしろ速い
>>239の環境が知りたい

>>270
apacheにしようぜ
0277nobodyさん04/05/25 18:46ID:???
>>275
hello worldとか簡単なやつでもエラー出ます。
エラーメッセージは↓これ。anhttpdのバージョンは1.42kです。

zend timeout window httpd.exe -アプリケーションエラー

"0x001554f4"の命令が"0x001554f4"のメモリを参照しました。
メモリが"read"になることはできませんでした。

>>276
やっぱapacheですかねぇ・・・
027824004/05/25 18:49ID:???
>276
>240 みてよ

loop数を5000にして幾度か試すと
for > foreach ≒whileになったよ。こっちでも。
最初のは、php5なんで無視してくれ。

でだ、カポコンの言うことは当てにならんということでFA
027924004/05/25 18:50ID:???
違った
>269 みてよ

でした。すまん。
028024004/05/25 18:51ID:???
だめだ、
> 263 見てよ

だった。吊ってくる
0281nobodyさん04/05/25 18:57ID:???
class hoge{
function hoge(){
$this->aa = array("(´д`)");
}
}
$hoge = new hoge();
echo $hoge->aa[0]; <-と言う呼び方は邪道なんでしょうか?
呼び出しようのメソッドを作るか、$aa = $hoge->aa;とやってから呼ぶべきなのでしょうか?
028226904/05/25 18:57ID:???
気悪くしないでね
そうするとPHP5はforeachが劇的に変わったのか
それ以外で何らかが変わってそういう結果が出たわけだ
そこが気になったので
0283nobodyさん04/05/25 18:59ID:???
ワロタ
イキロ
028427704/05/25 19:27ID:???
apacheいれたらサクサク動きました
感謝
0285nobodyさん04/05/25 19:32ID:???
>>281
クラス内の変数にアクセスする場合は、呼び出し用のメソッドを作って参照するのが基本だよ。
0286nobodyさん04/05/25 19:46ID:???
PHP4は完全にカプセル化できないけど
後々の事考えたらそう覚えた方がいいね
0287nobodyさん04/05/25 19:49ID:???
クラス使う側からしたら取得したい要素気にしないといけないわけだからな
設計を見直してみるとか
0288nobodyさん04/05/25 19:55ID:???
MVCで作るのが基本だよ
0289nobodyさん04/05/25 20:07ID:???
ボケるんだったら振り幅を大きくしろ
中途半端なんだよ
0290nobodyさん04/05/25 20:24ID:???
レスが多いと思ってたらカポコンの自演とベンチ厨か
C言語って書いてるあたり素人だろ>カポコン

それと、定期的に現れるベンチ厨ウザイから、ベンチスレでも立ててくれ
0291nobodyさん04/05/25 20:50ID:???
>>290
おまえが立てろ
029226704/05/25 21:01ID:???
>268
ループの外でも、計測範囲に入っているなら影響するべ。
もしあなたがでっかい配列を count() に渡しているなら、
今度リファレンスで渡してみ。すごく速くなるから。
0293nobodyさん04/05/25 21:04ID:???
>>291
ベンチ厨乙
0294nobodyさん04/05/25 21:04ID:???
>>292
標準語で話してくれませんか?
掲示板に方言使うとかキモ過ぎですよ
恥と思わないのか
0295nobodyさん04/05/25 21:05ID:RFog7Rov
php使っているサイトで、書き込んでも自分の書き込みがサイトにのこりません。
そこで、自分の書き込みが自分のPCに保存されるようにするにはどうしたらよいでしょうか?
PHPかPerlを使ってプログラムを書かないといけないでしょうか?
P3, 733MHz, 256MB, win 2k pro, IE6です。何方かよろしくお願いします。
0296nobodyさん04/05/25 21:08ID:???
>>295
(´ω`)??
029726704/05/25 21:08ID:???
>268
ループの外でも、計測範囲に入っているなら影響するでしょ。
もしあなたがでっかい配列を count() に渡しているなら、
今度リファレンスで渡してごらん。すごく速くなるから。
0298nobodyさん04/05/25 21:15ID:???
>>295
( ゚Д゚)??
0299nobodyさん04/05/25 21:18ID:???
益々盛り上がってまいりました。
030029504/05/25 21:20ID:RFog7Rov
はっきりかけば、出会い系サイトで自分の書き込みは相手にいくけど、
自分の書き込みが鯖にのこらないんです。
それで、鯖に残らないなら、自分のPCに保存するということをしたいな、
という意味で書きました。これでお分かりになりました?
0301nobodyさん04/05/25 21:22ID:???
>>300
メモ帳に書く→Ctrl+Sキーを押す。
やったね、できたね。ヒャッホウ!
030229504/05/25 21:29ID:RFog7Rov
>>300
温泉?って表示されるかな?
0303nobodyさん04/05/25 21:30ID:???
>>302
( ゚Д゚)ポカーン
030429504/05/25 21:31ID:RFog7Rov
>>301
さっきは間違えました。ありが�dこのサイト教えてあげる。
ttp://www.france.co.jp/bunko/yougo/yougo_y.html
0305nobodyさん04/05/25 21:32ID:???
>>295
こんなところにいないで出会い系に行ったほうがいいんじゃないかなぁ?

はっきり言えばもう消えろ!
030629504/05/25 21:34ID:RFog7Rov
喪前が消えろよ
0307nobodyさん04/05/25 21:37ID:???
>>300
貴方がそのサイトのスクリプトを弄れるなら、
そういう機能(鯖にログ保存)を実装する、
または実装されたアプリを使う。サイトの作りに
手が出せないのなら、自前でProxyっぽいのを実装する
手もあるが、現実として貴方の取れる方法は、301の示した方法かな。
つまり「書き込む内容を事前にどこかに手動で残しておく」

書き込みの内容がどうも的を射てないように思えるので、自分で何とか
するんじゃなくて、既にできているものを探して利用するという方向で。
0308nobodyさん04/05/25 21:38ID:ulnj232e
自己IPを表示するphpを教えてください
ホームページに入れたいんです
0309nobodyさん04/05/25 21:40ID:???
そろそろバカをかまうのやめようぜ。
居付いてしまったらウゼェし。
0310nobodyさん04/05/25 21:43ID:ulnj232e
いや、リアルで探している訳で
どのphpも付加機能ばっかいらん
0311nobodyさん04/05/25 21:45ID:???
スルーしろよ
0312nobodyさん04/05/25 21:47ID:ulnj232e
ここはなんで人が悪いの。。
近所の人としゃべって事も無いのでは…
それよりphp教えて
0313nobodyさん04/05/25 21:52ID:???
>>312
本買えば?
0314nobodyさん04/05/25 21:53ID:???
count()にリファレンスを渡す話を初めて聞いたのでちょっと調べてみたんだけど、
マニュアルにもUserContributedNotesにも載ってなくて、ほんとの所はどうなんだろう?
試せばすぐ分かるんだろうけどマンドくせ。

ソースだと関係する所はこれくらいかな。
ext/standart/array.c
 PHP_FUNCTION(count) -> php_count_recursive(zval *array, long mode TSRMLS_DC)
中ではポインタで渡してるだけの気がするんだが。
0315nobodyさん04/05/25 21:54ID:GONN/rJf
ぐぐってみたんですが、わからなかったので....
mb_encode_mimeheader
ですが、日本語が10文字くらいになると末尾が文字化けしてしまいます。
「こんにちはこんにち(B」
みたいな感じです。
それよりも短い文字列だと文字化けしません。

phpのバージョンは4.3.6です。

よろしくおながいします
0316nobodyさん04/05/25 21:58ID:???
echo <<< EOM
TEST←定数
EOM;

EOM内で定数を使うことはできるのでしょうか?
0317nobodyさん04/05/25 22:06ID:???
>>316
できません。
0318nobodyさん04/05/25 22:22ID:???
>>315
mb_internal_encodingは?
0319nobodyさん04/05/25 22:29ID:GONN/rJf
>>318
315です。
デフォルトのままです。

コードはSJISで書いているんですが、mb_encode_mimeheaderするまえに
mb_convert_encodingでJISに変換しています。
0320カポコン04/05/25 22:48ID:???
なかなか面白かったよ。
つーかwin2000でphp語るなよw。
0321nobodyさん04/05/25 23:05ID:???
>>320
「C言語」なんていってる素人が何言ってるんだか
0322nobodyさん04/05/25 23:13ID:???
>>321
「D言語」なんて言ってる素人が何言ってるんだか
0323カポコン04/05/25 23:15ID:???
C語って言えってか?俺はそういうのは嫌なんだよ。
いくら2chでも貴様の数倍偉い人が決めた言葉よ?
好みでいいだろ。それとオツムの良さはまた別物。
あとベンチマークすんのはいいけど、
>>237-239みたいにちゃんとした結果出せないと説得力ねーよ。
なんだよ%,%ってTimerクラス使ってるのにそりゃーねーだろ。
所詮2chのウンコ厨だな、そんなんだからいつまで経っても
3流の領域抜け出せねんだよ。あと試すんならunix系入れて試せ。
 素 人 は お ま え 。
0324nobodyさん04/05/25 23:26ID:???
>>319
mb_encode_mimeheader使うのにmb_convert_encodingで変換なんかするからだろ。
0325nobodyさん04/05/25 23:37ID:???
カポコン神襲来
0326nobodyさん04/05/26 00:19ID:???
カポコンって誰?
0327nobodyさん04/05/26 00:21ID:VdU4NQov
皆さんにお聞きしたいのですが、PHPの書籍のなかで
GDを詳しく扱った本はありませんでしょうか?
本の中の1つのコンテンツとして扱っていても結構ですので教えて下さい。
あと、GDを説明しているサイトもできればお願いします…。
0328nobodyさん04/05/26 00:28ID:???
>>326
誰もかまってくれないものだからジサクジエーンで自分を誉め称えるイタいやつ
0329nobodyさん04/05/26 02:01ID:???
>>328
それはお前の見方だろーが。
0330nobodyさん04/05/26 02:12ID:???
結局、神叩きして終わりかよ。
0331nobodyさん04/05/26 02:30ID:???
>>329-330
やあ、カポコン。今夜も来たの? ( ̄ー ̄ )ノ
0332nobodyさん04/05/26 03:31ID:???
>>327
PHPの書籍でGDの詳しいのねぇ。心当たりはないね。
GDは、今は独自パッチがあたったのがPHPに添付されてるけど
ImageMagickと同様、元々外部のグラフィックライブラリだから
PHP以外での使用方法にも探す範囲を広げた方が良いよ。
0333nobodyさん04/05/26 03:33ID:???
カポコンって頭叩いた時の音?
0334nobodyさん04/05/26 03:48ID:???
空っぽだからいい音出すのね。
0335nobodyさん04/05/26 04:08ID:???
>>334
(σ^Д^)σ うまい!座布団2枚!
0336nobodyさん04/05/26 04:16ID:???
>>323
プログラミング言語C 或いは C が妥当か。
あとbenchmarkだが他人様のはアテにせず自分でとろうな。

>>326
アホ共がこぞって使う共用のコテハンってところじゃないの?

>>327
無い。
■ このスレッドは過去ログ倉庫に格納されています