【PHP】下らねぇ質問はID出して書き込みやがれ 83at PHP
【PHP】下らねぇ質問はID出して書き込みやがれ 83 - 暇つぶし2ch75:nobodyさん
09/04/07 16:31:53 4/ZzdyJu
>>74
ありがとうございます。
Red Hat Enterprise Linux ES release 3 です。

76:nobodyさん
09/04/07 16:35:07
>>75
ああ、RHか
企業参入後のそれは使ったことないから控えとくわ

77:nobodyさん
09/04/07 16:38:40
>>73
ディストリとか関係ないからw
/etc/logrotate.d/httpd にログファイルのパスを追加するだけ。

78:nobodyさん
09/04/07 17:30:41 4/ZzdyJu
>>77
あ、そっか。。 ありがとうございます!

# vi /etc/logrotate.d/httpd
------------------------------
/var/log/httpd/*log /var/log/mysystem/systemlog {
missingok
notifempty
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true
endscript
}
------------------------------

79:nobodyさん
09/04/07 17:35:09
>>77
覚えたてで使いたかったんだろ。

80:nobodyさん
09/04/07 19:57:49
質問初心者クンはここを見て質問の仕方を覚えてこい
URLリンク(www.gekiura.com)

81:nobodyさん
09/04/07 20:12:36
>>80
注意

82:nobodyさん
09/04/07 21:57:01 nY33/bGj
csvファイルAからcsvファイルBへ特定の行だけを移動したいと思ってます。
チェックボックスで選ばれた行をAから削除しBへ書き込むプログラムを
色々考えたのですがさっぱり検討もつかず1週間経ちます
どうかヒントだけでもいいので教えてください。

83:nobodyさん
09/04/07 22:09:02
ファイルを2つ同時に開いて出したり入れたり

84:nobodyさん
09/04/07 22:11:16
csvのカラム構造はどうなってるのさ
一意なキーがあればあとは簡単だと思うが

85:nobodyさん
09/04/07 22:58:39
URLリンク(wikiwiki.jp)

一応、一問一答でwikiにためてたりスレのテンプレを記録するために借りてみた
一緒に更新お願いします
PHP用のwikiってことでお願いします
ページ下部のアフィは勝手についたもので俺には1円も入らないから気にしないで下され

86:nobodyさん
09/04/07 22:59:22
いや自分が更新しろや

87:nobodyさん
09/04/07 23:03:12
wikiのタイトルを「PHPの事はここ見やがれ」したら受けそう

88:nobodyさん
09/04/07 23:15:48
下らねぇ質問はここ見やがれ
でいいじゃん

89:nobodyさん
09/04/07 23:17:18
編集の仕方がわからない><

90:nobodyさん
09/04/08 03:33:41 0hFuJwMz
別の板できいたらスレチだったのでここで質問します
変数の中に入ってる文字列をファイル名として
変数.txtとか変数.jpgのようにあらわすにはどうすればいいのでしょうか?

91:nobodyさん
09/04/08 03:51:35
>>90
$x = "hogehoge";
echo "$x.txt";
URLリンク(jp.php.net)

92:nobodyさん
09/04/08 08:18:56
$x.'.txt';
どっちがいいんだかいつも迷う

93:nobodyさん
09/04/08 11:11:24 r8DEvZ6R
whileでもforでもどちらでも繰り返しの表現ができるときは、
特にこだわりなくforでやってても問題ないでしょうか?
○○な理由で、できる限りこっちでやったほうがいいみたいなことないですかね。
よろしくお願いします。

94:nobodyさん
09/04/08 11:13:40
$x.'.txt';
だと、エディタが変数の色代えてくれるけど、
設定で"の中の$も代えてくれるかもしれん

95:nobodyさん
09/04/08 12:55:37 cjj/9xGO
すみませんが、質問です。

リクエストパラメータが正の整数であるかどうかをチェックしたいのですが、
どういう方法が良いでしょうか?

is_int()は使えませんが、is_numeric()も良くなくて、結局 preg_match()を
使うしかないのでしょうか?

(参考)PHPと16人の仲間達 : is_numeric は・・・なぁ
URLリンク(php16.exblog.jp)


96:nobodyさん
09/04/08 13:12:20
頻出すぎて萎える

97:nobodyさん
09/04/08 13:16:37
>>95
試してないけどこれは?
$s = チェックする値
if($s<0)echo "負の数です";

98:nobodyさん
09/04/08 13:16:47
pregだと数値か文字列か判別できんだろ

99:95
09/04/08 13:45:02 cjj/9xGO
ちょっと質問を補足します。
あるリクエストパラメータが、通常の正の整数(の文字列化)になっているか
を判別したいのです。
リクエストパラメータは文字列ですから、is_int()は使えません。
is_numeric()はある程度使えますが、"+0123.45e6"もtrueになってしまいます。

・trueとなってほしい値。
"1", "0001", "132", etc...

・falseとなってほしい値
"0", "-1", "1.0", "0xFF", "+0123.45e6", etc...

これにかなうのは、 preg_match('/^\d*[1-9]$/', $param)
しか思いつかないのですが、他に何か良い方法はないでしょうか?

100:nobodyさん
09/04/08 13:48:37
>>99
それ、間違ってるだろ。とりあえず。
preg_match('/^[1-9]+\d*$/D', $param)

101:nobodyさん
09/04/08 13:49:06
"+1"はどうなのよ"+0"はどうなのよ

102:95
09/04/08 13:56:41 cjj/9xGO
>>100
それは >>99の "0001" が trueになりませんし、
"0"がtrueになってしまいます。

>>101
どちらもfalseです。trueになるのは"正の整数"と>>95,>>99で書いています。
あと、符号を含むものはfalseのつもりでした。

しかしこの流れだと、正規表現以外なさそうですね。

103:nobodyさん
09/04/08 14:01:54
ちょっとPHPカテゴリを辿ってみたけど

URLリンク(php16.exblog.jp)
【結果】
strpos = 1.4秒
preg_match = 7.0秒
・・・あー・・・結構違いますね・・・。
寝ます。

URLリンク(php16.exblog.jp)
上記の結果は・・・
"1234" の出力になります。("1212"じゃなく)
つまり、static宣言した変数の値は
メソッド呼び出し元のインスタンスが変わっても保持されています。
なんでこうなってんだろう?

とか言ってるレベルの奴のblogだぞ?

104:95
09/04/08 14:13:53 cjj/9xGO
>>103
引用したページが私の質問の意図をうまく説明するものだったので貼りました。
他のページが全部間違いでも問題ないと思います。


105:nobodyさん
09/04/08 14:15:08
is_numeric って

is_numeric("0xFF"); // 16進表記



is_numeric("+0123.45e6"); // 指数表記

をTRUEとしてしまうようです。(マニュアルに書いてありますけどね)


マニュアルに書いてあるんじゃん

106:nobodyさん
09/04/08 14:16:58
>>95
それ10の倍数だとfalseだけど。
ctype_digit($param) && $param > 0
でいいんじゃないの。

107:95
09/04/08 14:24:10
>>106
ご指摘のバグは今さっき気づいたところです。

> ctype_digit($param) && $param > 0
まさに望みどおりのものです。ありがとうございます。

108:95
09/04/08 14:24:40 cjj/9xGO
あ、下げてしまった。>>107は私です。では失礼します。

109:nobodyさん
09/04/08 14:44:33
何か俺が作るサイトはデザインが自分でも悪い。
何かみてくれをよくするテクニックを纏めたオススメの書籍はありますか?

110:nobodyさん
09/04/08 15:09:24
認識してるのにデザインが悪いと思うってことはなにかと比べてるからだと思うが
その比べてるデザインの優れたと思うものを真似してみればどうだろう
好みなんて人それぞれだし万人が好むと思って押し付けても違ったりするから

111:nobodyさん
09/04/08 15:23:02
デザインは板違いじゃないか?

112:nobodyさん
09/04/08 15:31:12
>>109
いくらみてくれはよかっても、アフィをみてほしいのか記事(内容)をみてほしいのか
意味不明なサイトじゃなきゃ問題ない。
もちろん見た目は大事だけど内容と見易さ(使いやすさ)だよ。



113:nobodyさん
09/04/08 16:59:27
>>109
このスレではPHPの文法以外のことを聞いても、あんまり答えは返ってこない。
悪いこと言わないから、この辺↓に移動して聞きなおしたほうがいいと思うよ。

Webサイト制作初心者用質問スレ Part 208
スレリンク(hp板)

114:nobodyさん
09/04/08 17:31:21
>>107
バグて。
仕様だろ。

115:nobodyさん
09/04/08 17:39:59 9xKyaeca
SQLとファイル、どっちをデータ保存に使うか?ってよく出る話題ですが、
たとえばチャットシステムのように
数秒単位でデータの挿入、更新、削除が行われる場合ってどっちがいいんでしょうか。
どっちでも扱いやすいほうで、構いませんか?

116:nobodyさん
09/04/08 17:42:13
パフォーマンス計ってみればいいじゃん

117:nobodyさん
09/04/08 18:13:22
好きな方でいいよ

118:nobodyさん
09/04/08 18:20:30
>>110 >>112
サンクス
先ずは、見易さ第一に作り次に自分が綺麗と思うサイトのHPのデザイン
を真似する事から始めます。
※真似されたHPの管理人は怒るかもしれませんが。

119:nobodyさん
09/04/08 20:24:35
チャットでパフォーマンスが気になるなら共有メモリとかにした方がいいんじゃないの。
使ったことないけど。

120:nobodyさん
09/04/08 22:25:24
>使ったことないけど

121:nobodyさん
09/04/08 22:26:15
>>115
俺の意見だと、ファイル保存が良いと思う。
アクセス解析作るのに使っている。

ただ、扱いやすいとは言えない

122:nobodyさん
09/04/08 23:16:49 tkomkeAN
取得したいページをfile_get_contentsで取りたいのですが、
url先とは違う内容が$fileに入ってしまいます
関数一覧のページなんですがどのようにしてしっかり取得することができるのでしょうか?

<?php $file = file_get_contents("URLリンク(jp.php.net)";);
echo $file;
?>


123:nobodyさん
09/04/08 23:33:25
はい?違う内容って?

124:nobodyさん
09/04/09 00:04:47 m7XTC3qO
【OS名】linux
【PHPのバージョン】php5.2.5
【質問内容】

文字列の中から英数字の部分だけを抽出したい場合は、どうやればいいでしょうか?
$str = 'あああaaa_いいいiii_ううう-20090401';

echo $result; // aaaiii20090401 と表示される

ereg("[a-zA-Z0-9]+", $str, $regs);
$result = $regs[0];
echo $result;
だと「aaa」しか取得できませんでした。

125:nobodyさん
09/04/09 00:35:29
>93
基本は、ループの頭に差し掛かった時点でループ回数が分かる場合はfor。
ループを回してみないと分からない場合はwhile。
whileの場合はループ変数がどう変わるかを意識しながらコードを読まなければいけない。
forならば基本的にループ回数はループに入る時点で分かるので、ラクに読める。

ただまあ、例外はいっぱいある。
「1000以下の3の倍数を全て列挙」なんて場合、事前にループ回数を調べる事はできる。
だけど、「変数が1000を超えるまで繰り返す」という意図ならば、それを反映してwhileで書いた方が読みやすいわけで。
一般論にするなら、自分の意図がもっとも読者に伝わりやすい表現を選べ、という事になる。

126:nobodyさん
09/04/09 01:26:24
>>91>>92>>94
ありがとう、それでよかったんですね。

127:nobodyさん
09/04/09 02:12:40 8Md27rPN
[とか]ってURLエンコードする必要ありますか?

ある文字がURLエンコードするべきかどうかってどうやって判断すればよいでしょうか?

初心者的な質問ですいません。。。


128:nobodyさん
09/04/09 02:19:15
>>127
URLリンク(ja.wikipedia.org)

129:nobodyさん
09/04/09 03:11:40
>>127
RFC1738とその関連文献を見るといいよ

130:nobodyさん
09/04/09 05:12:24
グーグルランクをPHPで取得する方法がわかりません

131:130
09/04/09 05:15:38 sBmn/pA0
グーグルランク取得したいです。PHPで
でも、その方法が調べてもわからないんです
PHP暦は一年でそこそこです

132:124
09/04/09 08:53:26
>>130
詳しく見てないけど、結構情報があるみたいですよ
Google rank 取得方法 の検索結果 約 321,000 件

URLリンク(www.xdelta.net)
Googleのページランクを知りたい場合は、対象となるURLとともに、そのURLのch値といわれるチェックサムが、Googleに問い合わせする際、必要になる。
ch値の算出方法については、しばらく謎とされてきたが、
Google PageRank Checksum Calculator
で、そのアルゴリズムが公開されてる。

URLリンク(mlog.euqset.org)
[PHP-users 33290]スクリプトでのGOOGLE pagerank取得について (続)
○ クラスに書き直したソースコードを公開しました
デモ
URLリンク(linux.ohwada.jp)
説明
URLリンク(linux.ohwada.jp)
ダウンロード
URLリンク(linux.ohwada.jp)

↑この「説明」ページに、PHPでGoogle Rankを取得する方法が解説されていました。

133:nobodyさん
09/04/09 09:01:18
>>124
preg_match_all("/[a-zA-Z0-9]+/", $str, $regs);
$result = implode("",$regs["0"]);

134:nobodyさん
09/04/09 09:03:14
正規表現(笑)

135:124
09/04/09 09:12:16
自己解決しました。

$str = 'あああaaa_いいいiii_ううう-20090401';
preg_match_all("([a-zA-Z0-9]+)", $str, $matches);
$regs = $matches[0];
foreach($regs as $reg) {
 $result .= $reg;
}
echo $result;

どうもありがとうございました>>124

136:124
09/04/09 09:14:20
>>133
implodeを使えば良いんですね!
どうもありがとうございます。

137:124
09/04/09 09:19:33
>>134
正規表現(涙)は、一度本を読んだんですが、頭に入らないです><
誰かチートシート(早見表)を作って配布してくれないですかね?
…てか、言いだしっぺ=自分で叩き台を作って、ここで添削してもらえばいいかな?

138:124
09/04/09 09:44:05
PHPの正規表現は、
(1) Perl互換の正規表現
URLリンク(jp.php.net)
(2) POSIX拡張の正規表現
URLリンク(jp.php.net)
の2種類が用意されてるんですね。

↓Perl互換の正規表現(PCRE)のチートシートは配布されてました。
URLリンク(phpspot.org)
↓チートシートじゃないけど、正規表現で使えるパターンのまとめ
URLリンク(www.rider-n.sakura.ne.jp)

PHPのマニュアルでは処理速度が違うとあったけど、それぞれ一長一短があるのでしょうか?
=使い分ける場合の基準はあるのかな?

URLリンク(php-web.net)
PHPでは、Posix拡張正規表現を利用することができます。
Posixとは、Portable Operating System Interface for UNIX の略で、 Linux を始めとする Unix 互換OSが満たすべき仕様を定めたものです。
Perl互換正規表現よりも機能は限定されていますが、汎用性は高いです。

POSIX互換正規表現<PERL互換正規表現ということで、簡単に済む場合はPOSIX、複雑な場合はPCREの出番になるのかな?
正規表現でうまく処理できない場合は、ANTLRという文字処理のライブラリを使えばいいそうですけど、PHPでANTLRが使えるライブラリとか配布されているんでしょうか?
URLリンク(pg.thumbnailcloud.net)

139:nobodyさん
09/04/09 10:21:07 3wJSGAQj
mkdirでディレクトリを作成する時、開発環境(WinXP)では簡単に作成されますが、
ネットのLinuxサーバ上ではパーミッションの問題で作成出来ない場合があります。

その場合、「パーミッションエラーで作成できない」事を
伝える必要があると思うのですが、そう言うことを調べる関数ってあるのでしょうか?

140:nobodyさん
09/04/09 10:32:12
やったことないけどディレクトリを作成する親でぃれくとりがis_executableかどうかでできないかな

141:nobodyさん
09/04/09 10:37:10
>>139
レンタルサーバだと、モジュール版のPHPがセーフモードに設定されていることが原因で、mkdirの利用が制限されている場合もありますね。

URLリンク(jp.php.net)
返り値
成功した場合に TRUE を、失敗した場合に FALSE を返します。

↑mkdirの返り血(FALSE)を浴びるだけではダメですか?

142:139
09/04/09 11:15:45 3wJSGAQj
>>140-141
つまり、単純に
if(!mkdir("test")){
die("ディレクトリが作成できませんでした。パスかパーミションを確認して下さい。");
}

みたいな感じで良いですかね?


143:nobodyさん
09/04/09 12:52:32 GoKaiEbv
vistaでphp5.2.8とapache2.2使ってます
ローカルの特定のファイルをfile_get_contentsで取得したいのですが
以下ではfailed to open streamで開けませんでした
$filenameをURLリンク(localhost)からURLリンク(127.0.0.1)

$filename = "URLリンク(localhost)";
$file = file_get_contents($filename);
echo $file;



URLリンク(q.hatena.ne.jp)を見てhostファイルが原因だと思うのですが
どのようにhostファイルを書き換えればよろしいでしょうか?

144:nobodyさん
09/04/09 12:53:27 GoKaiEbv
すいません4行目途中でした
全文修正版です↓

vistaでphp5.2.8とapache2.2使ってます
ローカルの特定のファイルをfile_get_contentsで取得したいのですが
以下ではfailed to open streamで開けませんでした
$filenameをURLリンク(localhost)からURLリンク(127.0.0.1)に直すと取得できました

$filename = "URLリンク(localhost)";
$file = file_get_contents($filename);
echo $file;



URLリンク(q.hatena.ne.jp)を見てhostファイルが原因だと思うのですが
どのようにhostファイルを書き換えればよろしいでしょうか?

145:nobodyさん
09/04/09 12:59:56 pGRnXLlI
以下のような多次元配列があります
これを1次元に直したいのでforeachを使いました
$ary[0][0]=1;
$ary[0][1]=2;
$ary[0][2]=3;
$ary[0][3]=4;
$ary[0][4]=5;
$ary[0][5]=6;

foreach($ary as $v) {
foreach($v as $vv) $h[] = $vv;
}

標準関数か何かでこれよりもスマートなやり方があった記憶があるのですがどなたかご教示お願い致します

146:nobodyさん
09/04/09 13:35:58
関数じゃないけど
$h= $ary[0];

とか??

147:145
09/04/09 13:44:57
>>146
とても効率の良いものですね
ありがとうございます


148:nobodyさん
09/04/09 14:51:46 IIKZIRWt
Imagick::roundCornersで画像の角を丸めると、
背景がいつも黒になってしまうのですが、
どのように設定すればよいのでしょうか?

149:nobodyさん
09/04/09 16:01:29 OhmeRcsr
PHPの関数についてググるとヘルプのミラーサイトが結構でてきます
ミラーサイトは公式サイトに断らなくても公開してもいいのでしょうか?
また、公式サイトで公開されているhtml形式のヘルプをダウンロードしてそのまま自分のレン鯖においても問題ないでしょうか?

150:nobodyさん
09/04/09 16:32:39
自分でライセンス確認すれや

151:nobodyさん
09/04/09 16:37:45
既にあるものをなんで公開しようと思うの?どうして?死ぬの?

152:nobodyさん
09/04/09 17:05:12
>>151
それをミラーサイト全ての管理人に言ってくださいませんか

153:nobodyさん
09/04/09 19:50:40
>>149
SEO対策なのかな?
PHPの公式マニュアルよりも、検索結果で上位に来るミラーサイトが多いですよね

自分の場合は、PHPの公式マニュアルをブラウザのお気に入りに入れてます。
URLリンク(jp.php.net)

google検索でヒットした結果を、改めてPHPの公式マニュアルで確認すればOK

154:nobodyさん
09/04/09 19:57:07
>>150は初心者で自分も調べ方知らないだけだろ

155:nobodyさん
09/04/09 23:15:50 YWPkP/9r
test.phpをテキストファイルとして出力させるのですが
このときブラウザの青い帯の部分(タイトルが表示される部分)に
任意の好きなタイトルを表示させたいのですが不可能でしょうか?
どなたかご教示お願い致します

【test.php】
<?php
header("Content-Type: text/plain");

echo "test";
?>

156:nobodyさん
09/04/09 23:32:12
青い帯の部分…
えっとね。君にはまだphp早い。
まずはURLリンク(www.w3.org)から始めよう。
ここを理解したらURLリンク(www.apache.org)
いって最後にURLリンク(www.php.net)
その青い帯作ってる糞マイクロソフトにも言っておいて。URLリンク(www.w3.org)を50万回読めと。

157:nobodyさん
09/04/09 23:40:47
バカのくせにえらそうに

158:nobodyさん
09/04/10 00:12:42
>>156
たぶん君も知識が足りないと思うんだがfxのタイトルバーの色が何色か見てごらん
あとoperaもな
大丈夫^^?

159:nobodyさん
09/04/10 00:18:26
今時WebKitじゃないブラウザーとか・・・・ゴミいか。
角丸つくるのにいまだに透過ジフ?w

160:nobodyさん
09/04/10 00:22:27
headerでjavascriptのコード埋め込めば任意のタイトルにできるんじゃない?


161:nobodyさん
09/04/10 00:27:38
>>159
それはないよ
WebKitはJavaScript周りがだめだめ

162:nobodyさん
09/04/10 00:28:34 z5toBuCm
PHP5.2使ってます。
ファイルを一意な名前で renameする良い方法ないですか?

tempnam を使ってファイル名を生成すると、その時点でファイルが生成されてしまうため、
renameできません。tempnam で作った後に unlinkするのは、やっぱり気分が良くないし、
厳密には一意性が保証されない気がするので。



163:nobodyさん
09/04/10 00:29:13
タイトルをHTTP Headerでどうにかするのは無理
<title>好きなタイトル</title>を出力するしかない

164:nobodyさん
09/04/10 00:31:59
>>162
renameという標準関数がある

165:nobodyさん
09/04/10 02:28:23 bYC4ar8C
staticなメソッドの中で、
それがHoge::moge()の形で呼ばれたのか、
$hoge->moge()の形で呼ばれたのかを判別するにはどうしたらいいですか?

166:nobodyさん
09/04/10 02:53:25
$thisを見るとか?

167:nobodyさん
09/04/10 05:12:52
>>165
そもそもstaticなメソッドをthisからメンバ関数として呼ぶべきじゃないよ

168:nobodyさん
09/04/10 09:47:55
static全否定?

169:168
09/04/10 09:48:47
ああ、ごめん勘違い

170:nobodyさん
09/04/10 10:13:06 0gMhmbJC
どなたか>>149もお願い致します

171:nobodyさん
09/04/10 10:32:51 BYyPBH+i
foreach を 配列の途中から始めることはできますでしょうか?
このような場合はforを使うのが普通なのでしょうか?

よろしくお願いします。

172:nobodyさん
09/04/10 10:38:07
>>171
>foreach を 配列の途中から始めることはできますでしょうか?
できないけど結果として同じものを得るのは可能

>このような場合はforを使うのが普通なのでしょうか?
はい

173:171
09/04/10 10:53:33 BYyPBH+i
>>172
レスありがとうございます。

やはりforを使うのが普通なのですね。
いちおう、後学のためにforeachを使って途中から開始する方法も教えていただけないでしょうか?

174:nobodyさん
09/04/10 10:58:47
forで初期indexがわかってる時しか使えないでしょ。
seekしてiterator使った方がいいよ。

175:nobodyさん
09/04/10 11:03:41
>>173
途中から開始するわけではなくて無駄な分はしっかりまわす感じ
whileでやるようなやり方

$array = array(1, 2, 3, 4, 5);

for ($i = 2; $i < count($array); $i++) {
 echo $array[$i];
}

$count = 0;
foreach ($array as $value) {
 $count++;
if ($count > 2) {
  echo $value;
 }
}

176:nobodyさん
09/04/10 11:11:03
foreach自体に途中から始める機能はないけど

foreach (array_slice($array, N) as $value) こうやるのが普通?かな

177:nobodyさん
09/04/10 11:11:14
>>175
マジレスするとforeachの中でifで判定する手法は古いとだけ記述しておこう

178:173
09/04/10 11:20:09 BYyPBH+i
>>174
すみません。
知識不足で「seekしてiterator」というのがわかりません;

>>175
なるほど・・・
こうしてみると、たしかに後者は無駄が多いですね。

>>176
array_sliceで途中から取り出すというのは思いつきませんでした!
これは使えそうですね!

179:nobodyさん
09/04/10 11:32:44
>>176
プチマジレスするとforeachの中でarray_sliceすると回すたびに関数が実行されるから
一度別の配列に入れるのがいい

180:nobodyさん
09/04/10 11:41:47
マジレスするとforでやりなYO

181:nobodyさん
09/04/10 11:44:44
>>179
以下のようにするとhogeが一度しか表示されないのはループの度にarray_sliceは実行されてfooは最初の一度だけってこと?

function foo()
{
echo "hoge<br>\n";
return array(1, 3, 5, 7, 9);
}
foreach (array_slice(foo(), 2) as $value) echo $value,"<br>\n";

182:nobodyさん
09/04/10 11:50:13
>>178
$ai = new ArrayIterator(array(1, 3, 5, 7, 9));
$ai->seek(2);
while ($ai->valid()) {
echo $ai->current();
$ai->next();
}

183:nobodyさん
09/04/10 11:53:22
>>175
forの中にcount入れるとかナイワ

184:nobodyさん
09/04/10 11:55:38 FoG5RXFZ
プロキシでHPにアクセスする人います
80番ポートでアクセスしたとか8080番ポートでアクセスしたとか何番ポートを使ってアクセスしたかを調べたいのですが
どのような関数を使うのでしょうか?

185:nobodyさん
09/04/10 12:00:51
>>183
よく嫁foreachだろ
forはiで現在位置がわかるが
foreachはわからないからな

186:nobodyさん
09/04/10 12:00:54 /dNSLV40
URLリンク(www.phppro.jp)
文字列フィルタについて質問です
上記ページと公式サイトには例が4つまで載ってるのですが
これはあくまでも一例で他にもあるのでしょうか?
もしよろしければ掲載されてないコードをご教示お願い致します

187:nobodyさん
09/04/10 12:01:22
>>179
こうやってもhogeは一度だけ表示されるけどもしかしてarray_sliceって特別な実行のされ方?

function slice2()
{
echo "hoge<br>\n";
return array(1,3,5);
}
foreach (slice2() as $value) echo $value,"<br>\n";

188:186
09/04/10 12:01:35 /dNSLV40
すいませんID出し忘れました
以後、気を付けます

189:nobodyさん
09/04/10 12:02:41
>>185
よく読んだらこう書いてありますね

for ($i = 2; $i < count($array); $i++) {
 echo $array[$i];
}

190:nobodyさん
09/04/10 12:24:25
>>175じゃないが俺もcount使ってるわ
配列の長さ取得するのってPHPだとcountじゃないの?
JavaやJavaScriptでいうlengthと一緒だよね?

191:nobodyさん
09/04/10 12:54:09
自分の場合、PHPでfor文使うのは、かなり少ないな。
なんかオフセット的なパラメータが出てくるのはうざったい。

自分の作ったコードでgrepしたら foreachの 1/10 以下だった。
while は半分ぐらい。

>>190
javascriptは微妙だけどね。
いきなり配列に x[100] = 'hogehoge'; とかすると、length は 101 になるくせに、
for(in) だと登録した1つしか出てこないし。そのわりに join は 101個結合するし。

192:nobodyさん
09/04/10 12:56:45
折れも、for文なら count()を使う。

でも、大抵 foreach 文で処理しちゃうけどね...

193:178
09/04/10 12:58:57 BYyPBH+i
>>179
そうだったんですか!
ということは、for($i = 1; $i < count($array); $i++)
のように書いた場合も、毎回count()が実行されるのでしょうか?
一度 $count = count($array)
のようにしたほうがいいですか?

>>182
ArrayIteratorというクラスがあったんですね。
ややコードが長くなりますが、配列が直感的に操作できますね!

配列のループだけでもいろいろなやり方があって、勉強になります!
質問してみてよかったです!

194:nobodyさん
09/04/10 13:04:28
// テスト用変数
function testAry() {for($a=0;$a<100;$a++) $h[]=$i;return $h;}
// タイム測定
function bench() {return microtime(true);}
// ベンチマーク表示
function cale($time) {
echo "<pre>";print_r($time);echo "</pre>";
foreach($time as $t) {echo "<p>".($t[1]-$t[0])."</p>";}
}
// --------- 比較コード ---------------- */
$time[0][0]=bench();

$test = array();
$cnt=count(testAry());
for($i=0; $i<$cnt; $i++) {$test[]=$i;}

$time[0][1]=bench();

// ---------- 175のコード ------------- */

$time[1][0]=bench();

$test = array();
for ($i=0; $i<count(testAry()); $i++) {$test[]=$i;}
$time[1][1]=bench();

/* ---------- ここまで ---------------- */

cale($time);


195:nobodyさん
09/04/10 13:05:15
>>192
マニュアル読め。

URLリンク(jp.php.net)
>この書き方には問題があります。 このコードは実行速度が遅くなることでしょう。 配列のサイズを毎回計算しているからです。 ...

>>179 の意味がイマイチ取りきれんのだけど、foreach がループ回数分だけ式を評価するってのは初耳。
ちょっとありえんと思う。

196:nobodyさん
09/04/10 13:06:32
>>194の続き

ベンチマーク結果

0.00026893615722656(countをforから外したコード)
0.016515970230103(>>175>>185が進めるのコード)



197:nobodyさん
09/04/10 13:07:52
>>195 間違い >>192 じゃなくて >>193
ごめんね。

198:nobodyさん
09/04/10 13:08:30
>>195
うほっ。最適化されるもんだとばかりorz。


199:nobodyさん
09/04/10 13:08:59
>>181
そういうこと
foreach (array_slice(foo(), 2) as $value) echo $value,"<br>\n";

fooは一度しか呼び出されないが、配列の数だけarray_sliceが動いてる

200:nobodyさん
09/04/10 13:11:00
>>194-195
参考になりました
ありっす

201:nobodyさん
09/04/10 13:14:39
>>199
マニュアルを読む限り、foreach が式をループ回数だけ評価するようには読めないんだけど。
っていうか、foreachが式が関数の場合に、関数は評価するが、その引数は評価しないとか、ありえんと思うが。

URLリンク(jp.php.net)

202:nobodyさん
09/04/10 13:16:50
さてベンチマークの俺の出番ですね

203:nobodyさん
09/04/10 13:19:31
>>202
お願いします。勇者!

204:nobodyさん
09/04/10 13:21:58
// テスト用変数
function testAry() {for($a=0;$a<1000;$a++) $h[]=$i;return $h;}
// タイム測定
function bench() {return microtime(true);}
// ベンチマーク表示
function cale($time) {
echo "<pre>";print_r($time);echo "</pre>";
foreach($time as $t) {echo "<p>".($t[1]-$t[0])."</p>";}
}
// --------- 比較コード ---------------- */
$time[0][0]=bench();

$test = array();
$h = array_slice(testAry(), 50);
foreach ($h as $v) $test[]=$v;

$time[0][1]=bench();

// ---------- 175のコード ------------- */

$time[1][0]=bench();

$test = array();
foreach (array_slice(testAry(), 50) as $v) $test[]=$v;

$time[1][1]=bench();

/* ---------- ここまで ---------------- */

cale($time);

205:nobodyさん
09/04/10 13:22:39
続き

テストした結果どちらもたいして変わらない

206:nobodyさん
09/04/10 13:28:45
結論からいえばforの中で関数は使うなってこと

207:nobodyさん
09/04/10 14:57:47
>>206
頭大丈夫か?

208:nobodyさん
09/04/10 15:08:18
>>207>>175

ベンチマークみて行ってんならおまえ致傷だな

209:nobodyさん
09/04/10 15:08:50
メールを受け取ったらphpファイルを起動させようとしているのですが上手くいきません。
昨日から詰まってます。。。。助けてください。
.forwardのパーミッションは600。メールの転送ができることは確認済みです。
PHP 5.0.4 FedoraCore

.forwardの中身
"| /usr/bin/php -q /var/www/html/test2.php"

test2.phpは単体で動かせることは確認済みです。
メールを受け取った後、test2.phpが動いてる様子がありません。。。


210:nobodyさん
09/04/10 15:10:47
>>207ってID出さないスレで正規表現でたたかれてた人物じゃない?
これ以上触れるとこのスレ荒らされるぞw

211:nobodyさん
09/04/10 15:16:10
>>209
test2.phpに#!/usr/bin/phpみたいなパスは書いてあるよな?

212:nobodyさん
09/04/10 15:17:53
これでダメならまたおいで

.forwardの中身
"| /usr/bin/php /var/www/html/test2.php"

test2.phpの中身の一行目(パスは自分の環境にあわせてね)
#!/usr/bin/php -q

213:nobodyさん
09/04/10 15:18:37
>>212
あ、test2.phpのパーミッションは705か755にしろよ

214:nobodyさん
09/04/10 15:19:09
>>210
お前が荒らしてるんだよ頭大丈夫か?

215:nobodyさん
09/04/10 15:20:35
わざわざ配列のカウントを変数に入れたりしないから
PHPだけの糞仕様を広めないでください
まともな言語なら差は出ません

216:nobodyさん
09/04/10 15:20:55
>>210
貴様のせいでこのスレに正規表現クンが来たじゃないかww
責任とって>>175を始末しろよw

217:nobodyさん
09/04/10 15:23:22
215必死w

218:nobodyさん
09/04/10 15:24:05
俺はーラッパーwwwwwwwwww
バイトはスーパーwwwwwwwwwwwww
タッパに葉っぱwwwwwwwwwwwwwwww
詰め込む河童wwwwwwwwwwww
頭はテンパーwwwwwwwwwwww
パッパカパーwwwwwwwwwwwwwwwwww

219:nobodyさん
09/04/10 15:28:04
>>215
>まともな言語なら差は出ません

( ゚Д゚)ポカーン

220:nobodyさん
09/04/10 15:33:34
まともな言語というかコンパイラ言語なら差はでないだろうな。
JAVAやC#なんかからきたやつはforの中でlength書いてるだろうし、
PHPでも別にcountを中に書いてもいいよ。
速度ってもミリ秒の誤差程度だし別に気にする必要もない。

221:nobodyさん
09/04/10 15:35:33
>>211
入れてませんでした。
だけれど試して見ましたがダメでした。

>>212
変化ありませんでした。
パーミは705でやってます。

あまりにも解けなさすぎて吐き気が。。。

222:207
09/04/10 15:39:26
いや・・・俺が言いたかったのは
forの中で関数使うな
for () {
//ここで使うな
}
っていってるのかと思っただけなんだが

223:nobodyさん
09/04/10 15:41:31
>>221
まず、パイプ前なのか、パイプ後なのか切り分けろや
とりあえず、シェルスクリプトならうごくかどうかやってみ。
touch hoge とかでいいから

224:nobodyさん
09/04/10 15:47:08
>>221
"| /var/www/html/test2.php"
これでよしっと

225:nobodyさん
09/04/10 16:08:39
>>223
メールうけとったあとのシェルの動かし方がわからん。
shhogeというファイルを作ってtouch hogeを書き込む。
sh shhogeで空ファイルが書き込めることを確認してから
パーミを705に変更。
.forwardの中身を"| /var/www/html/shhoge" や
"| /var/www/html/sh shhoge"にしてみて、メールを受け取ってみたが
だめだった。


>>224
それは最初にやったお。
test2.phpに#!/usr/bin/phpつけてやってもだめだったお。

226:nobodyさん
09/04/10 16:10:46
一回再起動してもちつけ

227:nobodyさん
09/04/10 16:29:11
.forwardには来てるの?

228:nobodyさん
09/04/10 17:16:00
>>226
何か変えるごとにメール鯖を再起動してるお。

>>227
メールの転送はできてるお。


229:nobodyさん
09/04/10 17:20:06
PHPとは関係ない気がするが、メールサーバのローカル配送ログは確認した?

230:nobodyさん
09/04/10 17:24:58
/usr/bin/php が無かったりしないの?

231:nobodyさん
09/04/10 17:25:20
>>229
ごめんなさいお。疲れたのでたったいまVMwareを落としたとこだお。
夜風を浴びて飯食べたら、また来るお。
メールサーバのローカル配送ログは観方が判らなかったので
スルーしてたお。あとで確認するお。

232:nobodyさん
09/04/10 17:33:36
とりあえずその言葉使いはやめような

233:nobodyさん
09/04/10 18:00:19
質問させてください。
レンタルサーバでcronを使って、2chを定期的に監視するプログラムを作ろうと思うのですが、
公開されているプログラムなどありませんでしょうか?
スレ違いならすみません。

234:nobodyさん
09/04/10 18:01:57
キミが監視しなくてもすでに他の人が監視してるから大丈夫

235:nobodyさん
09/04/10 18:23:48
>>233
監視って具体的になにをするのね

236:233
09/04/10 18:44:10
>>235
とりあえず自分のブログに盛り上がっているスレのリンクと、
先頭数レスの表示をしようと思ってます。

237:nobodyさん
09/04/10 19:31:13
>>236
専ブラ作るために公開されてる仕様があるのでそれ嫁ができます

238:162
09/04/10 20:32:35 z5toBuCm
>>162 はやっぱりないですかね。

>>164
多分、質問の意味を理解されてません。

239:nobodyさん
09/04/10 20:35:19
flockしる

240:nobodyさん
09/04/10 20:38:07
>>239
flockとどういう関係が?


241:nobodyさん
09/04/10 20:46:12
一時的に利用するためのファイルの名前にこだわる理由がわからない

242:nobodyさん
09/04/10 20:48:58
>>238
まず、自分がどうやってるか書いたら?
良い方法は?って言われてもな。

一意な名前を取得する方法なんて腐るほどあるっしょ。
インデックスを保持するファイルを一つ作っといて、そこで一意を確保してからrenameするとか
すきなアルゴリズムにしたらいいよ

243:nobodyさん
09/04/10 20:56:57
>>233
URLリンク(akid.s17.xrea.com)
URLリンク(www9.atpages.jp)


244:nobodyさん
09/04/10 21:06:39
連番でいいよもう

245:nobodyさん
09/04/10 21:48:10
forの中で関数呼び出しはPHPに限らず大抵の言語でもパフォーマンスが落ちる。
コンパイラや実行環境が最適化してくれる場合もあるし、大した差がつかないのは事実だけどな。
初心者がやってたら理解していない可能性を考えて訂正するのは正しい姿勢だと思うが。

>194-196, >204
ベンチマーク取るにしては処理が短すぎる。
そのくらいだとPC内のほかのタスクとかがノイズになって意味のある数字が出ない。
1秒とか10秒とかの単位で時間がかかるような規模の試験をした方がいい。

246:nobodyさん
09/04/10 21:58:27
批判する前に自分もコードを出したらいいじゃん

247:209
09/04/10 22:19:41
ログを見ても原因らしい原因が判りません。。。。

.forward
"| /usr/bin/php /var/www/html/test2.php"

test2.php
#!/usr/bin/php -q
<?php
print "START";
system("touch hoge");
echo "end";
?>

maillog
postfix/smtpd[3703]: connect from atg-asm1.t-com.ne.jp[218.219.54.53]
postfix/smtpd[3703]: 2895E5DC486: client=atg-asm1.t-com.ne.jp[218.219.54.53]
postfix/cleanup[3707]: 2895E5DC486: message-id=<004a01c9b9de$15f7cf10$0701a8c0@XXXXXX551ed45>
postfix/qmgr[3669]: 2895E5DC486: from=<AAAAAAAAA@tba.t-com.ne.jp>, size=1594, nrcpt=1 (queue active)
postfix/smtpd[3703]: disconnect from atg-asm1.t-com.ne.jp[218.219.54.53]
postfix/local[3708]: 2895E5DC486: to=<YYYYYYYYYY@ZZZZZZZZ.homeip.net>, relay=local, delay=0, status=sent (delivered to command: /usr/bin/php /var/www/html/test2.php)
postfix/qmgr[3669]: 2895E5DC486: removed


248:nobodyさん
09/04/11 01:44:12
パフォーマンス云々よりも
count()っていうのはループ中に値が変わる可能性があるわけで
バグによってループする回数が変わってしまう危険性

っていうほうが避ける理由じゃないかな。。


249:nobodyさん
09/04/11 01:48:10
あと、上のほうにあったJavaScriptの話で

arr.lengthとfor(x in arr )を同じつもりで使うのは危ないよ。

例えばDOM使うと、forだと思ったとおりにならないときがあると思う。


250:nobodyさん
09/04/11 02:13:44 jaJ+Ur9l
httpヘッダのcontent-typeを取得したいのですが
送った、あるいは送る予定のheaderを取得するにはどうしたらいいですか?

251:nobodyさん
09/04/11 02:28:50
URLリンク(jp2.php.net)

252:nobodyさん
09/04/11 02:36:37
こんな関数あったんですね
ありがとうございました。

253:nobodyさん
09/04/11 02:55:15
headers_listって自分で設定したヘッダしか取得できないんですね
デフォルトで送る予定のContent-Type: text/http等は
決めうちで取得させるしかないですか?

254:nobodyさん
09/04/11 05:24:48 HAu5s/9P
ファイルアップロードに関する質問なのですが、
$_FILEのtypeは信用できないということを聞いたので、
別の方法で取得するようにしたのですが、
その他のname、size、errorなどは信用してもよいのでしょうか?
nameなどはエスケープ処理などする必要がありますか?

よろしくお願いします。

255:nobodyさん
09/04/11 05:49:24
>>247
それで、hogeは出来てないんだよね?
次はerror_log書いて、PHPのログをチェックかな


256:nobodyさん
09/04/11 06:24:24
>>245
>1秒とか10秒とかの単位で時間がかかるような規模の試験をした方がいい。
そこまで両者に差が出るとは思えないし
そんな結果が出るまでやるとなるとメモリが足りなくなるでは?
できるならぜひベンチ結果をみてみたいが
というかそんな規模のものPHPじゃ作らないだろうし杞憂な気もするけど・・・

>>248
>count()っていうのはループ中に値が変わる可能性があるわけで
>バグによってループする回数が変わってしまう危険性
だいたいこういう処理は配列を1つずつ取り出す場合に使うのであって
対象の配列数が変わるような処理をやるほうがおかしいのでは?
具体的にどのようなことをするのか検討もつかないけど・・・
バグによってループ回数が変わるっていうのも意味不明

>>183もナイワと批判を書くのではなくて
外におけばPHPではパフォーマンスがあがるという注釈をつければここまで伸びなかった

257:nobodyさん
09/04/11 06:53:18 /nX8neeQ
PDOのマニュアルには失敗した時の動作が、書かれてないんですが、
このあたりはドライバ依存ってことなんでしょうか?

URLリンク(jp.php.net)
URLリンク(jp.php.net)

例外で処理するのか戻り値で処理するのか、イマイチわかりません。
とりあえず、今使ってるSQLiteでは戻り値で判断できるみたいですが、ちょっと不安だなぁと言うことで。


258:nobodyさん
09/04/11 07:09:52
>>257
PDO用の例外があるでしょ
PDOExceptionだったかな

259:nobodyさん
09/04/11 07:17:24
>>257
失敗しても気にするなよ。諦めたらそこで試合終了だよ

260:nobodyさん
09/04/11 07:18:25
>>258
でたらめなSQL書いてqueryしても例外でないんですよ。
で、戻り値はfalse

ちなみに環境は PHP5.2.9 とWindows版にバンドル版されてるSQLite です。

261:nobodyさん
09/04/11 07:22:23 YDJbdlsq
基本的なことだと思うのですが、
<?php
$a .= "あ"
. "い"
. "う"
;

$b .= "あ";
$b .= "い";
$b .= "う";

echo $a."<br><br>".$b;

?>
の結果は同じになると思いますが、
少し複雑に変数やループ処理を入れたときに、
なぜか$aの方の"あ"の部分が消えてしまいます。
しかし、$b方式だと成功します。
>少し複雑に変数やループ処理を入れたときに、
を詳しく説明したいのですが、コードが長く、
まとめるにも上手く伝える術が見つかりませんでした。
簡易に説明すると、
データを参照して、何ページかを判断して、
リンク付きのページ番号をずらっと表示させるようなプログラム部分になるのですが、
どうして$aではできないのに$bだとできるのか疑問に思いました。
何か心当たりありましたらよろしくお願いします。

262:nobodyさん
09/04/11 07:25:34 YDJbdlsq
追記

ループ処理した$aを、
クラスの変数、private $a;
に格納していって、function get_a(){return $this->a;}
の、get_a()メソッドで参照したときに問題が起こりました。

phpは5.2.6です

263:nobodyさん
09/04/11 08:31:57
コードが長けりゃどこかにうpすればいいのに

264:247
09/04/11 09:40:31
>>255
error_logはsystemの戻り値の判定のところに書けばいいの?

265:nobodyさん
09/04/11 10:03:46
とりあえず、どこまで出来てるのか確認するのが基本
だから、<?phpの後でいいんじゃね?

266:247
09/04/11 10:37:14
エラーログを吐き出すようにしてみました。
単体でtest2.phpを動かすとログを出しますが、
メールを介して動かしてもログが吐き出されませんでした。

maillog
(delivered to command: /usr/bin/php /var/www/html/test2.php)

.forward
"| /usr/bin/php /var/www/html/test2.php"

test2.php
#!/usr/bin/php -q
<?php
error_log("テストエラー",0);
system("touch hoge");
?>

267:247
09/04/11 10:48:01
forwardでコマンドは実行されているみたいですがtest2.phpは動いていない。
・.forwardの中が間違っている。→/usr/bin/phpは存在する。 
               →/var/www/html/test2.phpでtest2.phpを
                動かせる。
・パーミッションが間違っている。→.forwardを600 test2.phpを705or755

あと考えられる事象はなんでしょうか。

268:nobodyさん
09/04/11 11:22:57
>>267
ディストリは何使ってるんだ?
それがわかれば同じ環境作ってやってみるけど

269:nobodyさん
09/04/11 11:32:38
>>267
.forward
"| /usr/bin/php -q /var/www/html/test2.php"
にしてみ

270:nobodyさん
09/04/11 11:35:55
.forward
"| /var/www/html/test2.php"

うちは、これで動くけど?

271:nobodyさん
09/04/11 11:59:26
まず
"| touch /tmp/hoge"

ってやってみて処理してるユーザ名を把握してはどうだろう

272:247
09/04/11 12:15:02
>>267
ディストリというのは環境という意味でいいのかな?
PHP 5.0.4kfedoracore4です。

>>269
>>270
試してみました。

>>271
suxxxxxxxのユーザーの空ファイルとなりました。
……test2.phpはroot。……まさか。。。


273:261
09/04/11 12:15:24 YDJbdlsq
ありがとうございます
自己解決しました。
実際は、
$a .= "あ"
. $i+1
. "う"
;
という風に、”い”の部分は計算式をいろいろと入れていたのですが、
その計算式を()でくくって
$a .= "あ"
. ($i+1)
. "う"
;
のようにしたら、できました。

274:247
09/04/11 12:23:05
>>271

作成されたファイルhoge
-rw------- 1 suXXXXXXX suXXXXXX 0 4月 11 08:36 hoge
.forward
-rw------- 1 suXXXXXXX suXXXXXXX 20 4月 11 08:35 .forward
test2.php
-rwx---r-x 1 root root 112 4月 11 08:02 test2.php

ごく。

275:nobodyさん
09/04/11 12:35:09 jPW674z3
グローバル変数はまったく使わないほうがいいのでしょうか?

276:nobodyさん
09/04/11 12:43:26
うん
スーパーグローバルは使うけど

277:nobodyさん
09/04/11 13:12:41
スーパーグローバルは便利だが、テストしにくくなる。
モジュールごと、クラスごとにテストを書かないといけないような、ややっこしいコードを作る時は避けた方がいい。

グローバル変数は使うべきではない、とされている。
これは、グローバル変数はどこでどう値が変えられるか分からないのが最大の理由。
ある時点でグローバルに何が入っているかは、プログラムの最初から最後まで全部読まないと分からない。
不具合発生時に原因を特定しづらいし、機能追加時などにどの時点でどの変数がどうなってるか分かりづらくなる。

いっぽう、一時変数は、その関数の中で生成され、その関数が終わったら消えるので、その関数の中だけ見れば値が分かる。
グローバルに依存しない関数は、同じ引数を渡せば同じ結果が常に返って来る。
プログラムのどこで呼ばれても(引数が同じならば)同じ結果が返る事が保証されているので、バグの原因を探しやすい。

278:247
09/04/11 14:11:26
ディレクトリィのパーミッションを777に変えてたら
test2.phpまで届いてログが出るようになりました。
ですが、system("touch hoge")が実行されず
まだ空ファイルが作られない状態です。


279:nobodyさん
09/04/11 14:16:55
file_put_contents("/tmp/hoge.txt", realpath("."));を書いてみて、
カレントディレクトリを把握してはどうだろう。そしたらパーミッションを確認してと・・


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch