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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/08/06 15:44ID:paJ4kjjQ
・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


抜けているものがあったら補足願います
0623nobodyさん04/08/19 15:10ID:???
>>619
そこを本人に考えさせるのが615のため
0624軟式PHP04/08/19 15:13ID:???
そだなー。スマソ。
あと俺はcase処理を1行で書くのは嫌いだな。
619のようなやつだったら配列処理でいいし。
062562004/08/19 15:15ID:HVGJn52b
PHP上では普通にできるのに・・・
なんか>>621の文言が言い訳にしか聞こえない(^^;
で、結局「四捨五入」する方法ってどれなの?
TRUNCATE() や FLOOR() ってどう工夫すると期待した結果が得られるの?
0626nobodyさん04/08/19 15:20ID:???
0.5足して切り捨て
0627nobodyさん04/08/19 15:20ID:???
>>624
私も書き方は気に入らないが個人の好みもあるし
最初はあんなものでしょ

>>625
てかMySQLにいけ
オマケにマニュアル読め
0628nobodyさん04/08/19 15:32ID:???
>>625
"四捨五入 銀行型"辺りでぐぐれ
明確にされてないのが気に食わないのかもしれないが、
そのround実装は普通(の範疇)だ
0629Imo ◆.jC7ANgFY. 04/08/19 16:12ID:???
>>625
私はマニュアルをコピペしただけですが?

0.5引いて切捨てしろってことだろ
FLOOR(`num` - 0.5)
0630nobodyさん04/08/19 16:14ID:h2ZrLQAF
こんにちは

教えて頂きたいのですが、
アドレスで
123/456/
の時は最後の「/」を削除して
123/456
の時は何もしない
最終的にどちらも123/456

となるようにしたいのですが、
何か方法ないでしょうか?
よろしくお願いします。
0631Imo ◆.jC7ANgFY. 04/08/19 16:17ID:???
>>630
最後が「/」の時は最後の「/」を削除して
ほかのときは何もしない。
をそのままプログラムにすればいいじゃない。
0632Imo ◆.jC7ANgFY. 04/08/19 16:21ID:???
>>630
ついでに言うとif文を使わずすっきり書く方法がある。
それがrtrimだ。あとはマニュアルをよく見ろ。
0633nobodyさん04/08/19 16:37ID:???
>>632
ども〜
マニュアルみてきました!
$trimmed = rtrim($text," \t.");
ってのがのっててそれで目的が達成できそうです。
欲しい関数はなんでもありますねw

ありがとうございました!
0634nobodyさん04/08/19 16:43ID:???
>>632
630ではないが、rtrimってこういう使い方もあったのか・・・知らなかった
「/」が可能という事は全ての文字で利用出来るという事ですね
0635nobodyさん04/08/19 16:45ID:???
「この関数は文字列の最後から空白文字を取り除き、 取り除かれた文字列を返します。
rtrim()は以下の文字を削除します。」と書いてあるが空白文字以外でも利用出来るなら
そう書いてくれよ
0636nobodyさん04/08/19 16:49ID:???
>>635
書いてると思うが?
ttp://php.s3.to/man/function.rtrim.html
0637nobodyさん04/08/19 17:24ID:???
ttp://php.us.themoes.org/manual/ja/function.crc32.php
ttp://www.beginnersphp.co.uk/digitalclock.php
を参考にしたのですがファイルのCRC4の取得方法がわかりません。
途中に出てくる ^ 排他的論理和(Xor?)がワケワカラン…

$file = "./data/a.png";
$size = filesize($file);
$fp = fopen($file, rb);
$da = fread($fp,$size);
fclose($fp);
echo crc4($da);
function crc4($a){
〜〜〜〜〜〜〜〜〜〜〜〜〜
処理
〜〜〜〜〜〜〜〜〜〜〜〜〜
return $crc_data;
}
こんな感じにしたいのです。
0638nobodyさん04/08/19 17:39ID:???
なるほど
0639nobodyさん04/08/19 17:58ID:???
>>635
string rtrim ( string str [, string charlist])
[]はオプション。お前オプション注意して見たことないだろ?
phpの関数には至る所にオプションがある
0640nobodyさん04/08/19 18:22ID:???
_ = 半角スペース

<tr>
__<td class="">
____<a href="http://hogepage.com/sample.php">サンプル</a>
__</td>
__<td class="">
____2004/08/19 00:00
__</td>
</tr>

以上の文字列から、パターン %<a href=\"(.+?)\">(.+?)</a>(.+?)</tr>% で
リンク部分を抽出して、さらに3番目にマッチした部分から、
パターン ([0-9]+/[0-9]+/[0-9]+ [0-9]+:[0-9]+:[0-9][0-9]) で時刻を
抜き出していますが、最初のパターンで、更新時刻もきれいに取得したいのです
もう少しコンパクトにすることはできないでしょうか?

どうぞよろしくお願いします。
0641nobodyさん04/08/19 18:34ID:???
>>640
こんな感じか?

preg_match_all('%<tr>(?:.*?)<a href="(.+?)">(.+?)</a>(?:.*?)(\d\d\d\d/\d\d/\d\d \d\d:\d\d)(?:.*?)</tr>%s', $html, $m);
print_r($m);
064262004/08/19 18:54ID:HVGJn52b
遅レススマソ
>>629
いや、知ってる、そのマニュアルの文言が言い訳っぽいって事
>>628
せめて一貫性を保ってほしいよな
select round(166.5); が166なのに
select round(167.5); が168になるのはどうかと・・・
そんな中途半端な関数最初から作るなって感じだな
というわけで、MySQLスレ逝ってくるわ
0643nobodyさん04/08/19 18:57ID:???
>>642
はぁ?
一貫性保ってんじゃん.バカ?
0644nobodyさん04/08/19 19:00ID:???
if(isset($_COOKIE['ck'])){
echo "COOKIE";
}
この処理をディレクトリ変えたらできなくなるのですがなぜでしょうか?
よろしくおねがいします
064562004/08/19 19:02ID:???
>>643
どの辺が?
0646nobodyさん04/08/19 19:06ID:???
>>645
"四捨五入 銀行型"でぐぐったのか?
0.5を偶数になるように繰り上げたり切り捨てたりするのさ
167.5 -> 168
166.5 -> 166
165.3 -> 165
0647nobodyさん04/08/19 19:07ID:???
>644
> ディレクトリ変えたら
意味わかんね
064864404/08/19 19:10ID:???
ええと、
<?php
if(isset($_COOKIE['ck'])){
echo "COOKIE";
}
?>
このファイルがa.phpで、hogeというディレクトリに入っていて、a.phpを実行するとCOOKIEと表示されます。
で、a.phpをhoge2というディレクトリに入れると、COOKIEと表示されないのです。
064962804/08/19 19:16ID:???
>>642
世の中には「偶数側に丸める(round(166.5)→166, round(167.5)→168)」
という丸め方法があって「銀行型の四捨五入」と呼ばれています

それに一貫性がないってのは……、銀行に文句を言ってみてくださいね(苦笑
0650nobodyさん04/08/19 19:20ID:???
>>641
うまくできました!
本当にありがとうございました

結婚させてください!
0651nobodyさん04/08/19 19:28ID:???
if(isset($_COOKIE['ck'])){
echo "COOKIE";
}
これって間違ってますか_?
なぜディレクトリ変えただけでクッキーの値取れないのだろう(汗
065262004/08/19 19:32ID:???
なるほどね、トンクス
とりあえず銀行に文句言ってくるわ
0653nobodyさん04/08/19 19:34ID:???
>>620
ネタ乙
0654Imo ◆.jC7ANgFY. 04/08/19 19:34ID:???
>>651
setcookieのオプションを全部うめてみればいかが?
0655nobodyさん04/08/19 19:38ID:???
いい加減コテハンうざいと思うのは俺だけか。
0656nobodyさん04/08/19 19:43ID:???
setcookieのオプションとは?(汗
065753004/08/19 19:47ID:???
どうも分からないので、PHPから直接oggファイルを弄る事にします。
エンコード後にタグ変える必要も出て来そうですし。
助言して下さった方々、ありがとうございました。

>>537
ちゃんとした物が出来たら何処かに放り投げておきます。
何処に投げれば良いかな?
使う人なんて居なさそうですけど。 ^ ^
0658nobodyさん04/08/19 19:49ID:???
>648
Cookieのpath設定してる?
0659軟式PHP04/08/19 19:49ID:???
   ∩___∩         |
   | ノ\     ヽ        |
  /  ●゛  ● |        |
  | ∪  ( _●_) ミ       j
 彡、   |∪|   |       >>655
/     ∩ノ ⊃  ヽ  
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ /
0660nobodyさん04/08/19 20:15ID:???
setcookie("ck", "a=1", time()+3600,"/");
pathは"/"としていますが、間違ってますかね?
0661nobodyさん04/08/19 20:21ID:???
変数に格納されない_| ̄|○
鯖を変える前まではできていたんだが
鯖を変えたらできなくなったぽ(´・ω・`)ショボーン
ちなみにどちらもPHP対応です、何が違うんでしょうか?
0662nobodyさん04/08/19 20:38ID:???
>661
鯖が違う
0663軟式PHP04/08/19 20:43ID:???
\
  \(⌒-⌒)
   (・(ェ,,)・ ) < そんなエサで俺様がクマー!!
    `つ   `つ      (´⌒(´
     ゝ_つ_`つ≡≡≡(´⌒;;;≡≡≡
              (´⌒(´⌒;;
      ズザザザ


    どこまで行クマ?
\   ̄∨ ̄ ̄ ̄ ̄ ̄ ̄    (´´
  \(⌒-⌒)   o       (´⌒(´
   (・(ェ,,)・ )つ⌒`つ≡≡≡(´⌒;;;≡≡≡
          ̄ ̄     (´⌒(´⌒;;
      ズザーーーーーッ
0664nobodyさん04/08/19 21:15ID:JfzAv2ME
みなさんは、掲示板などのログを保存する際に区切り記号は
どのようなものにしていますか?
私はタブにしているのですが、ネットでは<>が圧倒的に多いので
その利点なども教えていただけると幸いです。
0665nobodyさん04/08/19 21:22ID:???
Kent




タブでいいよ。<>は本文にないとも言い切れないし
0666nobodyさん04/08/19 21:25ID:???
自分もタブ。
ログファイル開いた時も見やすいし。
0667nobodyさん04/08/19 21:31ID:???
,
0668nobodyさん04/08/19 21:31ID:???
fopen()でサイズの大きいファイルを開くにはどうすれば良いですか?
FATAL: emalloc(): Unable to allocate エラーが出ます
file_get_contents()でも使って変数に読み込むしかないのかな


タブか…良いことを聞いた。φ(.. )メモメモ
0669Imo ◆.jC7ANgFY. 04/08/19 21:43ID:???
>>668
freadの第二引数を512*1024くらいにしながら順番に処理するべし。
0670nobodyさん04/08/19 21:47ID:???
>>668
fopenごときでそんなエラーが出るはずは無いんだが・・・。

・根本的な対処
スクリプトのメモリを無駄に使っている部分を直す。
(ファイルの中身を一気に変数に入れてたのを一定サイズに抑えるとか)
・刹那的な対処
PHPやWebサーバのメモリ関係の制限を緩和する。
(当然他の部分に皺寄せが行くので刹那的)
0671nobodyさん04/08/19 21:59ID:???
>>669 >>670
fopenの所為じゃなかったのか…
切り分けしてきます
067267104/08/19 22:11ID:???
あ(汗
他のところでミスってました。
1GBも読み込もうとしてたorz
お手数をおかけしました。
0673nobodyさん04/08/19 22:13ID:???
タブってどんなの?
0674nobodyさん04/08/19 22:18ID:???
>673
\t
0675nobodyさん04/08/19 22:19ID:???
fopenもmallocを呼ぶけどな
0676nobodyさん04/08/19 22:22ID:???
そんなの当たり前だろ・・・
0677nobodyさん04/08/20 01:15ID:???
ログはserialize() / unserialize() を使う方がPHP的で良いんじゃないだろうか。
0678Imo ◆.jC7ANgFY. 04/08/20 01:31ID:???
>>677
実はserializeはexplodeより高速という(ry
0679nobodyさん04/08/20 02:26ID:???
>>676
>>670
0680nobodyさん04/08/20 05:40ID:???
PHPでコマンドラインスクリプトつくってます。
標準入力から読み込む方法と、標準エラー出力にだす方法がわかりません。
マニュアルのどこに書いてありますか?
0681nobodyさん04/08/20 06:02ID:???
〜〜〜このスレはマニュアルの読み方から教えるスレになりました〜〜〜
0682nobodyさん04/08/20 06:25ID:???
標準入力とエラー出力が判らない人がいるのは、
WebPage記述用スクリプトとして生まれてきた性なんだろうな。
0683nobodyさん04/08/20 06:34ID:???
まあPCスキルが高くて経験が豊かな俺から言わせてもらえば
UNIXを知らない奴はプログラム作っちゃだめだな
0684nobodyさん04/08/20 07:15ID:???
>>681
マニュアルのどこに書いてあるのか分からなかったので質問しました。
Windows用のマニュアル(*.chm)を使ってるのですが、キーワードにないし、
検索しても見つかりません。
件枠キーワード: standard output, stdin, stdout, ...
なお英語版のマニュアル使ってます。
0685nobodyさん04/08/20 07:55ID:???
>>684
stdin で検索したらあったけどな。
(*.chm)日本語版だけど
0686軟式PHP04/08/20 09:04ID:???
   ∩___∩         |
   | ノ\     ヽ        |
  /  ●゛  ● |        |
  | ∪  ( _●_) ミ       j
 彡、   |∪|   |       >>683
/     ∩ノ ⊃  ヽ  
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ /
0687nobodyさん04/08/20 13:24ID:???
軟式たべろ
0688nobodyさん04/08/20 15:13ID:???
長いHTML文中に数十の<?php ?>を埋め込むような場合、
まとめて全てを<?php ?>で囲っちゃった方が負荷が少なかったりします?
大した差は無いかな。。
0689nobodyさん04/08/20 15:18ID:???
>>688
そんなことより、それじゃ読みにくいので、
テンプレート(またはソレっぽいの)として分割してください。
0690nobodyさん04/08/20 16:03ID:???
PHP で作った禁則処理ってどこかにありませんか?
0691nobodyさん04/08/20 16:11ID:???
すみません、質問させてください。
100 / 1.05を計算すと95.238095238095になるのですが、
小数点第何位までと決めることはできますか?
また、やり方もご教授お願いします。
069269104/08/20 16:12ID:ttg46q2U
age忘れました。
0693Imo ◆.jC7ANgFY. 04/08/20 16:14ID:???
>>691
round関数を参照
0694nobodyさん04/08/20 16:15ID:???
PHPのスクリプトからファイルにバイナリデータを出力するにはどうすればよいのでしょうか?
配列に入っている数値を1バイトずつファイルに書き出したいのですが
どうやってもテキストで出力されてしまいます。。。orz
069569104/08/20 16:16ID:???
>>693
ありがとうございました。
0696Imo ◆.jC7ANgFY. 04/08/20 16:22ID:???
>>694
初心者にはchr関数ですべてループさせることをすすめる。

すっきりやりたければこんなことしてもできる。
call_user_func_array('pack', array_merge(array('c*'), $list));
0697nobodyさん04/08/20 16:40ID:???
>>691
$a=round(100/1.05*100)/100;
echo $a; //95.24
0698Imo ◆.jC7ANgFY. 04/08/20 16:42ID:???
>>697
round(100/1.05, 2)のほうがいい
0699nobodyさん04/08/20 16:48ID:???
>>698
うおーー
それでも行けるのかw

ちとスクリプト書き直すよ!
ありがとう〜〜
070069104/08/20 16:50ID:???
>>697-698
なるほど、そういう書き方もありましたか。
$motone=$_POST["money"] / 1.05;
$motone=round($motone , 0); //round関数で$motoneの値を整数にする
と書いていました。
0701nobodyさん04/08/20 16:54ID:???
ところで、最近php初めてようやく上で書いた
$a=round(100/1.05*100)/100;
ってのも覚えたんだけど、
例えば、
function a(){
$zz = 1234;
}
function b(){
echo = $zz;
}
としてもecho = $zz;は表示されないのだけど、
これを$zz = 1234;の値を他のfunctionで使い回す事ってどうやればいいんでしょうか?
今は全部のfunctionで$zz = 1234; を書いてます・・・

よろしければ教えていただきたいのですが。
0702Imo ◆.jC7ANgFY. 04/08/20 16:57ID:???
>>701
function a(){
global $zz;
$zz = 1234;
}
function b(){
global $zz
echo $zz;
}
0703Imo ◆.jC7ANgFY. 04/08/20 16:58ID:???
>>701
b関数内のglobalのセミコロン抜けた。
というわけで報告ついでに別な方法も。

function a(){
define('ZZ', 1234);
}
function b(){
echo ZZ;
}
0704nobodyさん04/08/20 17:02ID:???
>>702>>703さん早速ありがと〜
そういう方法なんですね!
多分マニュアルに書いてあると思うのだけど、
その方法をマニュアルで探す方法がわからなくてw
ありがとうございました!
0705軟式PHP04/08/20 17:36ID:???
\
  \(⌒-⌒)
   (・(ェ,,)・ ) < そんなエサで俺様がクマー!!
    `つ   `つ      (´⌒(´
     ゝ_つ_`つ≡≡≡(´⌒;;;≡≡≡
              (´⌒(´⌒;;
      ズザザザ


    どこまで行クマ?
\   ̄∨ ̄ ̄ ̄ ̄ ̄ ̄    (´´
  \(⌒-⌒)   o       (´⌒(´
   (・(ェ,,)・ )つ⌒`つ≡≡≡(´⌒;;;≡≡≡
          ̄ ̄     (´⌒(´⌒;;
      ズザーーーーーッ
0706nobodyさん04/08/20 17:40ID:???
>>702
global は綺麗にスクリプトを書こうとする時邪魔なので
class化してvarにまとめる事をオススメする
070770604/08/20 17:42ID:???
>>706 s/702/701/
0708nobodyさん04/08/20 17:56ID:???
バイナリデータを16進数にして2byteずつ読み込み10進数にする

〜略
$hdata = bin2hex($bdata);
$i=1;
while($i<=$size){
 $ddata = hexdec(substr($hdata,$i*2-2,2));
 $i++;
}
略〜

こういう感じの処理を速くすることはできますか?
forからwhileにしたら少し速くなった
base_convert(,16,10)からhexdecにしたら少し速くなった
これくらいしか思いつかないのでよろしくお願いします。
0709軟式PHP04/08/20 18:04ID:???
class hoge
{
var $zz;
function a()
{
$this->zz = 1234;
}
function b()
{
echo $this->zz;
}
}
0710Imo ◆.jC7ANgFY. 04/08/20 18:07ID:???
>>708
unpackの配列つかえば一発。
0711nobodyさん04/08/20 18:09ID:???
>>708
バイナリデータを一旦16進数にする意味はあるのか?
0712nobodyさん04/08/20 18:23ID:???
〜略
$hdata = unpack("C*",$bdata);
$i=1;
while($i<=$size){
 $ddata = $hdata[$i];
 $i++;
}
略〜

これだと>>708のほうが速いのです。
0713nobodyさん04/08/20 18:40ID:???
PHPAccelerator を 使えば一発。
0714nobodyさん04/08/20 18:49ID:???
>>712
$i=0;
while($i<$size){
 $ddata = ord($bdata[$i]);
 ++$i;
}
だとどうだろうか?
0715nobodyさん04/08/20 18:50ID:???
>>713
実行テストは自分のPC(OSはWindows)で行ってますが、
最後に使うのはレン鯖なのでインストはむりぽ

と思ったけどxreaは実験的に導入してくれてるようです。
0716nobodyさん04/08/20 18:56ID:???
またxreaに厨が増えたのか・・・
0717nobodyさん04/08/20 18:56ID:???
>>714
速くなりました。
ありがとう御座います。

ord -- 文字のASCII値を返す
↑ASCII値ってのが意味わからなかったので触ってませんでした。

これかもPHPの勉強を励んでいきます。
0718Imo ◆.jC7ANgFY. 04/08/20 19:24ID:???
>>717
こうしてほしかったんだけどまぁいいや。
foreach (unpack("C*",$bdata) as $ddata) {
}
0719nobodyさん04/08/20 20:47ID:???
>>718
>>714 の方が少し速いみたいだしメモリ使用量は >>714 の方が少ないので >>714 でいいんじゃないの?
0720nobodyさん04/08/20 21:06ID:ho3qNz5a
http://www.soramimi.info/a-bbs/mbbs/mbbs.cgi?id=12345
管理人殺害!!!
0721Imo ◆.jC7ANgFY. 04/08/20 21:06ID:???
>>719
たしかに巨大ファイルだったら配列に入れない>714の方がはやいがな。
072271404/08/20 21:32ID:???
(´д`*)デヘヘ....
■ このスレッドは過去ログ倉庫に格納されています