【PHP】質問スレッドpart17【php】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/05/17 17:14ID:AT+bUkag・新規質問の方は上げてください。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
抜けているものがあったら補足願います
0182nobodyさん
04/05/23 23:45ID:???0183nobodyさん
04/05/23 23:48ID:???出力制御関数ってバイナリセーフじゃなかったか?
PHPを使うならやって当然だろうから、既に試しているかも知れんが・・・
ob_start()
(例えば)imagepng($image_res)
ob_get_contents()→DBに登録
ob_end_clean()
とかでできんのかな?
>>179
レス番合ってる?
0184nobodyさん
04/05/24 00:05ID:???やっぱり先日の分か。
板違いなので付け加えなかったんだが、そもそもresultをDBに入力するのがおかしい。
priceが変わるとresultも変えなきゃならんので、resultは相関サブクエリで済ますべきだろ。
disk_DB(disk_id,shop_id,price)
SELECT *,(SELECT count(*) AS result FROM disk_DB WHERE disk_id=T1.disk_id AND price<= T1.price) FROM disk_DB AS T1;
で、count値を0にしたい件だが、resultが必ず1から4までどこかにはある。というのであれば、
disk_DB(disk_id,shop_id,price,result) ※SQLが長くなるのでとりあえずresult有りで
SELECT DISTINCT result,COALESCE(T1.cnt,0)AS count FROM disk_DB
LEFT JOIN (SELECT result,count(result)as cnt FROM disk_id WHERE shop_id='shopA' GROUP BY result)AS T1 USING(result);
こんなん浮かびましたw
>>180の例だけだと
result | count
-----+------
1 | 0
2 | 1
3 | 0
4 | 1
0185184
04/05/24 00:13ID:???resultというのがpriceの価格順という意味ならサブクエリで済ますべきと思っているので、
resultが別の意味であるなら、入力(カラム)は必要です。
0186_
04/05/24 00:46ID:???( ゚Д゚) ポカーン
そういう事聞いてるんじゃないだろう。
まぁ >>182 は質問の作り方が悪かったな。
PHP-users にでも投げてみたら?
0187nobodyさん
04/05/24 00:58ID:???ベリーサンクスコ!あと板違いすいません。
作成当初のスタンスはDBに不足点があってもPHPで補えるだろうなと思っていたんですが、実はDBの設計て
とても重要だったんだということを思い知りました。
184さんの意見を参考にDB設計から見直す必要あり、と感じた今日この頃。
てかSQL文なげーw
0188nobodyさん
04/05/24 01:49ID:XP231UgD「0」を文字として認識させることは出来るのでしょうか?
つまり、
-----
if("0"=="000"){} //これをfalse
if("0"=="0"){} //これをTrue
-----
な感じです。
0193nobodyさん
04/05/24 02:23ID:???0194nobodyさん
04/05/24 02:45ID:???俺も簡易的にイメタグやテーブル使ったりするな。
テーブルはブラウザで見え方が違うので厄介ではあるが。
JpGraphは色々あって便利なんだけど、
改造しようとソースに手を出すと嵌るので、
欲しいグラフの種類が少なくて固定できる
(値じゃなくて形がね)のなら、自分で作った方が楽。
HotScriptにもいくつか転がってる。
0195nobodyさん
04/05/24 19:04ID:nTbKpLsJPHP4.3.6からPDFlibのバージョンが5.03(PDF 1.4)にアップグレードしていますが、
以前は、
$enc = mb_internal_encoding();
$txt = chr(254).chr(255).mb_convert_encoding("日本語のしおり","UTF-16",$enc);
pdf_add_bookmark($pdf, $txt, 0, 0);
というコードで日本語のしおりが表示できたのですが、PDFlibが新しくなってからは、
Fatal error: PDFlib error: [2602] PDF_add_bookmark: Code page '932' not supported
というエラーで落ちてしまうようになりました。
Dosプロンプトで作成しているので、usモードにして再作成してみましたが、
状況は変わりませんでした。
対処法をご存知の方、ご教授願えませんでしょうか?
0196gh
04/05/24 20:17ID:???file_get_contents 関数と
file_put_contents 関数は
読み込み・書き出しの時ファイルロックしているのでしょうか?
0197nobodyさん
04/05/24 22:44ID:XP231UgD配列に項目名が入っています。
-----
$array = array("食べ物", "野菜", "ワイルド系", "キャベツ");
-----
で、これを
-----
$array = array(">食べ物", ">>野菜", ">>>ワイルド系", ">>>>キャベツ");
-----
と、項目名の前に、「>」を"配列番号+1"個付加したいのですが、
どのようにすればいいのでしょう。
0198nobodyさん
04/05/24 22:54ID:???項目名の前に、「>」を"配列番号+1"個付加するようなスクリプトを書いてください。
制御構造を使っても、配列関数を使っても、好きな方法で構いません。
0199nobodyさん
04/05/24 23:04ID:???for ( $i=0; $i<count($arr); $i++ ) {
$arr[$i] = str_repeat('>', $i+1).$arr[$i];
}
print_r($arr);
0200nobodyさん
04/05/24 23:31ID:???ありがとうございます。
>>198さん
str_repeatという存在を知りませんでした。
というか、PHP関数の全てを把握し切れていません。
やはり、覚えるしかないのでしょうか?(そんな気がする)
0201nobodyさん
04/05/24 23:39ID:???別に、str_repeat使わずとも簡単に出来るし、
あれだけ整備されたマニュアルが提供されているのだから、
経験積めば意図する関数があるかどうか雰囲気的にわかる。
0203カポコン
04/05/25 02:21ID:???スクリプトじゃない。本物ならこう書くだろう。
<?php
$slash = "<";
$str = $slash;
$arr = array("食べ物", "野菜", "ワイルド系", "キャベツ");
foreach($arr as $key => $value):
$arr[$key] = $str.$value;
$str .= $slash;
endforeach;
print_r($arr);
?>
この方がPHPらしくないか?
つーか高速だし分かりやすい。
経験よりも才能。いじょ。
0204nobodyさん
04/05/25 02:31ID:???PHPで配列を扱う場合はfor < while <foreach の順で速く動作する。
更に関数を使わず文字列結合の演算のみで処理を終わらせている点。
点数付けると100点満点だわ。
しかも最後に大事なのは才能っていってる部分が
カポコンファンの漏れにはたまらない。
これならstr_repeatがサポートされてないPHP3でも動作する罠、
さすがは神。ところで神様とこのHP最近更新滞ってるから
こんなところでパンピー相手せずに速く更新きぼんして下さい!
0205nobodyさん
04/05/25 02:32ID:???0206nobodyさん
04/05/25 02:50ID:???でもカポコンが頭がいいのはPHP理解した人間になら分かる。
※関数を使うプログラムより関数を使わないプログラムの方が優秀である。
これ定説ね。天才かどうかは微妙だけど。早速HP見てきます。
0207nobodyさん
04/05/25 02:55ID:???for($i=0;$i<count($arr);$i++){
$leftarrow.='>';
$arr[$i]=$leftarrow.$arr[$i];
}
print_r($arr);
0208カポコン
04/05/25 02:57ID:???はいはい才能乏しいですよ。
じゃー僕以上のスクリプト書いてもらえます?
自分には才能以外の要素は無いんで。
199にアドバイス付け加えるんなら、テストに使うなら
print_rよりvar_dumpを使う事をオススメしとこう!
0209207
04/05/25 02:57ID:???0210nobodyさん
04/05/25 03:02ID:???<?php
$leftarrow = '>';
$str = $leftarrow;
$arr = array("食べ物", "野菜", "ワイルド系", "キャベツ");
foreach($arr as $key => $value):
$arr[$key] = $str.$value;
$str .= $leftarrow;
endforeach;
var_dump($arr);
?>
0213nobodyさん
04/05/25 03:28ID:???ないと断言しておく
0214nobodyさん
04/05/25 03:34ID:???0215nobodyさん
04/05/25 05:45ID:???質問どうぞ
0216nobodyさん
04/05/25 08:39ID:???反論は要らないんでカボコンさんとやらは巣に戻って下さい
0217nobodyさん
04/05/25 09:17ID:???0218404.HDML ◆StMXML.EXE
04/05/25 09:19ID:???>PHPで配列を扱う場合はfor < while <foreach の順で速く動作する。
これってマジですか?
0219nobodyさん
04/05/25 09:47ID:???whileはループ時に条件判定
foreachはループ時に要素内のポインタ移動
下に行く程ループ時の処理が軽いって事じゃねーの?
0220404.HDML ◆StMXML.EXE
04/05/25 10:00ID:???成程、そういう事なのですね。今までwhile優先で時々for、という感じでこの2点のみを
使ってて、正味foreachの存在自体を忘れてました。。
0221nobodyさん
04/05/25 11:06ID:???つーか、連想配列の場合だとforeachを使わんと何かと面倒じゃね。
0222nobodyさん
04/05/25 11:30ID:???0223nobodyさん
04/05/25 11:32ID:???0224nobodyさん
04/05/25 11:33ID:???俺はCからプログラミング覚えたからfor使ってる。
0225404.HDML ◆StMXML.EXE
04/05/25 11:55ID:???while(list($name,$value) = each($array));
当方、いつもこんな書き方ばかりしてたんですよ。
whileに較べてforは遅い、とだけ小耳に入れた時に「じゃぁforeachも遅いのかな?」と
勝手に思い込んでいた節が有りまして。
0226nobodyさん
04/05/25 12:06ID:???俺はCの標準関数っぽいのが揃ってたからPHPを使い出したという経緯があるから
Cライクな記述をしてる
0228nobodyさん
04/05/25 12:19ID:???気になるやつはPHPのソース追うなり
ベンチ取るなり気の済むまでやってくれ
重箱の隅穿り返すような論議は他で頼む
0229nobodyさん
04/05/25 12:30ID:???ttp://jp.php.net/manual/ja/function.str-repeat.php
確かにstr_repeat()はPHP3では動作せんから、>>203はPHP3でも動くかと思ったけど
ttp://jp.php.net/manual/ja/control-structures.foreach.php
・・・・これ釣(ry
0230nobodyさん
04/05/25 12:35ID:???いいじゃねぇかYO
処理速度(効率)やコードの見易さなど、、
十人十色いろいろあって宗教じみた話になるかも知れんが、
他の人のやり方を聞くのも、たまにはあっていい。
0231nobodyさん
04/05/25 13:27ID:???複数人が関わる開発じゃなければ自分に合った書き方がベスト
0232nobodyさん
04/05/25 14:42ID:???公式ページのマニュアルかなにかに書いてあったような気がする。
だから俺は for で回してる。
0233nobodyさん
04/05/25 14:56ID:???str_repeatが採用された細かいバージョンをキボン。
0234nobodyさん
04/05/25 14:56ID:???好きに書けばいい
0236nobodyさん
04/05/25 15:11ID:???>whileはループ時に条件判定
>foreachはループ時に要素内のポインタ移動
で処理が進むならforeach文の方が速いだろ。
配列扱うのにループのたびに初期化なんてしてたら効率悪すぎ。
0237nobodyさん
04/05/25 15:15ID:???試してみると大分違う。
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:???$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:???0243nobodyさん
04/05/25 15:28ID:???ありがとう
0244nobodyさん
04/05/25 15:36ID:???for ($i = 0; $i < $max; ++$i) {
$arr2[$i] = $str2.$arr2[$i];
$str2 .= $leftarrow;
}
の部分だけど、>>199はfor文内でcountを使ってたから
もっと遅くなっていただろうな。
0245nobodyさん
04/05/25 15:39ID:???0246nobodyさん
04/05/25 15:45ID:???0247nobodyさん
04/05/25 15:47ID:???whileやforの条件チェックよりも、foreachの配列チェックの方が早いんだね。
whileはlistかeachのどっちかがボトルネックなのかな
0248nobodyさん
04/05/25 15:57ID:???俺もこれからまめにベンチとってみよう
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);
}
?>
0251nobodyさん
04/05/25 16:18ID:???>※関数を使うプログラムより関数を使わないプログラムの方が優秀である。
一部の香具師によって、否定されていたがある意味正解。
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:???0255nobodyさん
04/05/25 16:27ID:???スクリプトじゃない。本物ならこう書くだろう。
0256nobodyさん
04/05/25 16:28ID:???0257nobodyさん
04/05/25 16:28ID:???自分には才能以外の要素は無いんで。
0259nobodyさん
04/05/25 16:30ID:???0262nobodyさん
04/05/25 16:36ID:???0263240
04/05/25 16:38ID:???ん、こっちは、
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:???0267nobodyさん
04/05/25 17:00ID:???count() を使うなら、せめて配列をリファレンスで渡してください。
でないとものすごく遅くなるよ。
0269nobodyさん
04/05/25 18:08ID:???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:???たまにエラーがでてサーバーが落ちてしまいます。
直す方法あるでしょうか。
0271nobodyさん
04/05/25 18:25ID:???チェックボックスにチェックが入ったもの全てを削除というのがなかなか出来ません。
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:???その際にチェックが入っているレコードを書き出さないようにする
0273nobodyさん
04/05/25 18:34ID:???0274nobodyさん
04/05/25 18:35ID:???0276269
04/05/25 18:41ID:???foreach≒whileでやっぱりforが一番速い
あとstr_repeatにしてもほぼ変わらないかむしろ速い
>>239の環境が知りたい
>>270
apacheにしようぜ
0277nobodyさん
04/05/25 18:46ID:???hello worldとか簡単なやつでもエラー出ます。
エラーメッセージは↓これ。anhttpdのバージョンは1.42kです。
zend timeout window httpd.exe -アプリケーションエラー
"0x001554f4"の命令が"0x001554f4"のメモリを参照しました。
メモリが"read"になることはできませんでした。
>>276
やっぱapacheですかねぇ・・・
0278240
04/05/25 18:49ID:???>240 みてよ
loop数を5000にして幾度か試すと
for > foreach ≒whileになったよ。こっちでも。
最初のは、php5なんで無視してくれ。
でだ、カポコンの言うことは当てにならんということでFA
0279240
04/05/25 18:50ID:???>269 みてよ
でした。すまん。
0280240
04/05/25 18:51ID:???> 263 見てよ
だった。吊ってくる
0281nobodyさん
04/05/25 18:57ID:???function hoge(){
$this->aa = array("(´д`)");
}
}
$hoge = new hoge();
echo $hoge->aa[0]; <-と言う呼び方は邪道なんでしょうか?
呼び出しようのメソッドを作るか、$aa = $hoge->aa;とやってから呼ぶべきなのでしょうか?
0282269
04/05/25 18:57ID:???そうするとPHP5はforeachが劇的に変わったのか
それ以外で何らかが変わってそういう結果が出たわけだ
そこが気になったので
■ このスレッドは過去ログ倉庫に格納されています