【PHP】下らねぇ質問はここに書き込みやがれ 24
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/07/07(金) 14:54:53ID:KnVubDvEここならお前の下らない質問に回答があるかも知れません。
まず読め【PHP マニュアル】
http://www.php.net/manual/ja/
過去スレは>>2
0481nobodyさん
2006/07/16(日) 00:16:25ID:???aaa<br>
bbb<br>
ccc<br>
HTML;
これのような出力を一気に配列に入れる方法を教えてください。
0482479
2006/07/16(日) 00:25:47ID:???こんな感じで書いたら
<?php
$str="aa<a>bb</a>aa"
$a_resulet=mb_ereg_search_regs("<a>*</a>",$str);
?>
こんなんになりました
Warning: mb_ereg_search_regs() [function.mb-ereg-search-regs]: No string given in /usr/local/apache2/htdocs/test.php on line 4
0484nobodyさん
2006/07/16(日) 00:45:50ID:???ob_start();
echo <<< HTML
aaa<br>
bbb<br>
ccc<br>
HTML;
$array = explode("\n", ob_get_contents());
//$array = preg_split("/\r\n|\r|\n/", ob_get_contents());
ob_end_clean();
print_r($array);
0485nobodyさん
2006/07/16(日) 02:33:24ID:???データの中にカンマが含まれている場合、そこで配列の項目として切っちゃいますよね?
そういう場合は本業プログラマさんは普通どういう方法で処理するものなんでしょうか?
よろしくお願いします。
0486nobodyさん
2006/07/16(日) 02:55:40ID:???別に決まりはないはず
たとえば単純に2byte文字「,」にするとか
特殊文字「,」(&#44;)にするとかね
0487nobodyさん
2006/07/16(日) 02:57:42ID:???普通は処理がしやすいようにデータフォーマットを作る。
例えばタブ区切りにするとか。
CSVつうてもエスケープのしかたで何種類かあるので
既存のデータなら、それに合わせて処理する。
EXECLの吐くやつとかだと処理ライブラリもあるけど
上手くいかないことも。
0488nobodyさん
2006/07/16(日) 03:20:47ID:???というか、変な置き換えをするのはウンコ。
置き換えは " だけ。"" と2回連続させる。
0489nobodyさん
2006/07/16(日) 04:14:19ID:???区切り文字には気をつけろ!
カンマ区切りの場合「ソ」の直後に「"」が来るとバグる関数がある(fgetcsvとか)
まぁ、そういうところを考えるのもプログラミングの楽しいところだな
・・・苦しむところでもあるが
0490nobodyさん
2006/07/16(日) 04:25:50ID:???>>473 みたいのが全てを表してると思う。
彼らはコーディングをアルゴリズムとは思っておらず
「指定すれば指定した通りの結果が出てくる」という
PHPを単なるツール、アプリケーションの操作と勘違いしている。
0491nobodyさん
2006/07/16(日) 04:28:48ID:???言いたい事は分かるけどね。
0492nobodyさん
2006/07/16(日) 04:33:07ID:???そこに至るまでの考え方など無用の長物なのだ
0493nobodyさん
2006/07/16(日) 05:18:14ID:???よかった。まだ俺と同じ考えのヤツがいたんだ。
このスレ、だんだん丸投げスレになってきたんでどうしようかと思ってた。
0494nobodyさん
2006/07/16(日) 05:31:42ID:???答えたくないなら答えなくても良いし
0496nobodyさん
2006/07/16(日) 05:51:09ID:???もっとも質問したのは1回だけですけど。あとはたまに覗いてます
0498nobodyさん
2006/07/16(日) 06:27:22ID:???print_rで出力すると何故か文字化けしてしまいます。
ブラウザのエンコードをUTF8に指定すると直るのですが、
いちいちそんなことしないでも普通に表示させたいのですが…。
<meta http-equiv="Content-Type" content="text/html; charset=utf8">
というメタをつけて文字コードを指定してるのですが上手くいきません。
どなたかよろしくお願いします。
0499nobodyさん
2006/07/16(日) 06:34:03ID:???META指定よりヘッダーで出力されてる文字コード指定の方が優先で
多分それがSJISかEUCにでもなってんでしょ。
php.iniで出力文字コードの指定があるから設定してみ。
header()使って自分で出力するのでもアリかもね。
0500nobodyさん
2006/07/16(日) 06:56:25ID:???0501nobodyさん
2006/07/16(日) 12:57:48ID:xiYRHM+hRPMのPHPはmbstringが組み込まれていないようです。
RPMは捨てて自分で入れ直すしかないですか?
0502nobodyさん
2006/07/16(日) 13:09:36ID:???srpm の spec ファイルを編集してリビルドすればo.k.
それか野良rpmを探すか。
自分ならソースから入れるね。
FreeBSDならports使うけど。
0503nobodyさん
2006/07/16(日) 13:22:28ID:???0505501
2006/07/16(日) 13:38:45ID:???レスありがとうございました。
アンインストールしようとしていたのですが
mbstringのパッケージをインストールしたら無事使えるようになりました。
0506nobodyさん
2006/07/16(日) 14:59:52ID:5V0Lpe7K最近はやりのスクロールにあわせて上下するフロートメニューを
PHPだけで作るコトってできますでしょうか?
縦に長いページの中でどこがブラウザに表示されてるのか取得して
画像を動かすことができれば作れそうですよね。
PHPでできるかな?
ttp://www.ws-company.jp/1f_info.php
↑ちなみにこんなやつです。ここのはJAVAで作ってるみたいですね
まあ、JAVA使ってもいいんだけど…
0507nobodyさん
2006/07/16(日) 15:02:08ID:???0509nobodyさん
2006/07/16(日) 15:04:56ID:???0510nobodyさん
2006/07/16(日) 15:12:40ID:???>>500
だめでしたー、php.iniを触れる環境にないためheader( )で出力する設定にしたんですが
文字化けなおりません。
<?
header("Content-type: text/html; charset=UTF-8");
echo <<< EOF
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title></head>
<body>
EOF;
$rec = file("hoge.log");
print_r($rec);
echo "</body>\n</html>";
?>
がコードです。
ひとつ気になるのは出力されたものをブラウザで「ソースの表示」をしてみると
「ファイルに含まれていたnull文字はスペースに変換して開きます」
というアラートが出てくることです、ここに何か糸口が…?
0511nobodyさん
2006/07/16(日) 15:26:00ID:???Java じゃない。JavaScript ね。しかも Firefox では正常動作していなかった。
PHP なんぞなくても、ふつーの HTML + JavaScript で終了。
0512nobodyさん
2006/07/16(日) 15:38:50ID:???0513506
2006/07/16(日) 15:49:07ID:5V0Lpe7KPHPでできたとしても、いっぱいの人がアクセスしたら
サーバーに負担かかりすぎちゃって話にならなそう?
やっぱり、クライアントサイドでやらないとだめかな?
0515nobodyさん
2006/07/16(日) 16:08:28ID:???結局何も分かっていなさそう…
だから、なんで PHP が出てくるんだ?
PHP で JavaScript を含んだ HTML を生成したとして
サーバの負担が心配だからクライアントサイドで?
言っていることが支離滅裂なんですけど、分かってる?
0516498=510
2006/07/16(日) 16:18:02ID:???もしかして読み込み元のhoge.logファイルをいくらUTF-8で保存しても、
phpがfile( )で読み込む時にコードの如何を問わずSJISとして読み込む設定になっている、
ってことはないでしょうか?
もしそうならphp.ini?とかの設定の問題なのでお手上げだなあと思ったんですが
0518nobodyさん
2006/07/16(日) 16:34:03ID:???PHP Version 4.4.2でdefault_charsetはShift_JISになってますー
header()の出力よりもこっちが優先されちゃうのかな…
0519nobodyさん
2006/07/16(日) 16:37:26ID:???> header()の出力よりもこっちが優先されちゃうのかな…
それならまず、file と print_r を使わずに UTF-8 で直書きした HTML を含む
コードを PHP で出力させて、化けるか否かをチェック。
0520nobodyさん
2006/07/16(日) 17:14:37ID:???さきほどのコードに追加しました
<?
header("Content-type: text/html; charset=UTF-8");
echo <<< EOF
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
※略
<body>
化けるかどうかテスト //←ここを追加
EOF;
$rec = file("hoge.log");
print_r($rec);
echo "</body>\n</html>";
?>
結果、「化けるかどうかテスト」は正常に日本語で、file()で読み込んだ部分は
文字化けで表示されました。
ただブラウザのエンコードをUTF8に変更すると、今度は逆に「化けるかどうかテスト」が文字化け、
file()で読み込んだ部分が正常に…、わけがわからなくなってきました
0521nobodyさん
2006/07/16(日) 17:16:42ID:???ブラウザはSleipnir1.66とIEの6を使ってます
一応書いとくとXP SP2です
0522nobodyさん
2006/07/16(日) 17:26:46ID:???手元(PHP 4.4.2)で試してみた。が、化けなかった。
ブラウザは Firefox 1.5.0.4 と IE 6 SP2
mbstring 関係の設定は何も変更してないはず。ソースから make で。
読み込み UTF-8 のファイルは BOM 有り・無しの何れも。
0523nobodyさん
2006/07/16(日) 17:33:15ID:???うーん、読み込むhoge.logの方をSJISで保存すると一応全体がSJISとして化けなしに表示されるので、
とりあえずはこれでしょうがないかと…。
0524nobodyさん
2006/07/16(日) 18:33:30ID:???>最近はやりのスクロールにあわせて上下するフロートメニュー
すっごく根本的なことを教えてあげよう。
そんなのは最近じゃなくて大昔からあるものだし、別に流行ってないし、
PHP関係ないし、っていうかウザいだけだから止めたほうがいいし。
初心者がサイト作るとすぐそういうウザい動きを付けたがるのは何故だろうね?
0525nobodyさん
2006/07/16(日) 18:44:07ID:???ちなみに >>522 の mbstring 設定値は
mbstring.detect_orderauto
mbstring.encoding_translationOff
mbstring.func_overload0
mbstring.http_inputauto
mbstring.http_outputSJIS
mbstring.internal_encodingEUC-JP
mbstring.languageneutral
mbstring.substitute_characterno value
でした。
0527nobodyさん
2006/07/16(日) 19:22:30ID:???ありがとうございます、今みてみたら化けていたサーバーは
mbstring.http_output SJIS SJIS
mbstring.internal_encoding SJIS SJIS
となってました。
525の人と同じ環境の他のサーバーで試してみたところ文字化けなしにいけました。
問題点がわかったので他のサーバーで動かすようにします、
ありがとうございました。
0528nobodyさん
2006/07/16(日) 22:03:44ID:???どうもてっとり早い方法が見つからない。
C でいえば
for(i = 0; c1[i] == c2[i]; i++ );
ぐらいのものなわけですが、php だとどうしたものでしょう?
similar_text だと、先頭からという限定ができないようだし、
ord($str) でCライクに比較しようにも、
先頭のアスキーしか取れないようなので、一々 substr で先頭を切っていくことになる?
substr_compare で徐々に len を減らしていく、という方法だと
ほぼ同じ部分文字列を毎回一から比較していくわけで無駄が多い。
こういうときはどうするのがうまい方法なのでしょう?
0529nobodyさん
2006/07/16(日) 22:26:57ID:???str1 = 'hogehoge';
str2 = 'hagehage';
for(i=0; str1[i]==str2[i], (i<strlen(str1) && i<strlen(str2)); i++);
これダメなんだっけ?
0530nobodyさん
2006/07/16(日) 22:34:51ID:???http://jp.php.net/manual/ja/language.types.string.php#language.types.string.substr
0531nobodyさん
2006/07/16(日) 22:52:04ID:???上手い方法を知っているわけではありませんがmb_substrで順番に見て行くほか無いような・・・
<?php
$str1 = "ABCD日本語wktk";
$str2 = "ABCD日本語kwsk";
$ln = min(mb_strlen($str1), mb_strlen($str2));
for ($i=0; $i<$ln; $i++) {
if (mb_substr($str1, $i, 1) != mb_substr($str2, $i, 1)) {
echo $i . mb_convert_encoding("文字目までは一緒", "SJIS");
break;
}
}
?>
0533nobodyさん
2006/07/16(日) 23:25:43ID:VEXOfJen$res=strtr($res," ","");
というふうにしたのですが、
全く置換できません。。
何が問題なんでしょ?
0535nobodyさん
2006/07/16(日) 23:30:10ID:???対象となるサーバはXREAです。
0540nobodyさん
2006/07/17(月) 10:02:03ID:???echoだと値が帰ってくるんだですが、
return $matches[0][0];
returnだと値が帰ってきません。
retuneは配列の値を表示することができないんでしょうか?
0541nobodyさん
2006/07/17(月) 10:30:25ID:???function hoge(){
// $matches配列の生成
return $matches[0][0]; // 値を返す
}
echo hoge(); // 値を表示する
なら表示されるはずだが。
0542nobodyさん
2006/07/17(月) 10:36:03ID:???ちょっと意味不明かと思いますが、
具体的には以下のIFでループが発生しました。
(ただ、再現性が著しく低いです。というか再現できなかったと思います)
$temp = explode( "/" , $_SERVER['SCRIPT_NAME'] );
$start = count( $array ); // $arrayは配列です。
for( $i=$start; $i < (count($temp) -1); $i++ ) {
// 変数 $i にアクセスしない処理
}
なんかやらかしてるでしょうか?
それともやっぱり環境なのかな?
0543nobodyさん
2006/07/17(月) 10:45:33ID:???0544nobodyさん
2006/07/17(月) 10:45:40ID:???0546nobodyさん
2006/07/17(月) 10:50:28ID:???0547nobodyさん
2006/07/17(月) 10:57:33ID:???で、できました
0548nobodyさん
2006/07/17(月) 10:58:04ID:???意味がわからないって事かな?ごめん 2ch語?よくしらないので
>>542の IF の記述法に問題があるのか。という点と、
例えば $array 等に NULL や文字列、オブジェクトなどの予想外の要素を
代入した場合に素直に動くのか、それとも予想もできない動作をするのか
等の情報が知りたかったと言うことです。
何かのネタだったらごめん。
ちょっと解説してくれると助かる。よかったらだけど…
0549nobodyさん
2006/07/17(月) 11:09:25ID:???ウルトラマンが悩みを聞いてあげるスレッド
1 名前:('A`) 2005/05/20(金) 21:05:58
/ || :ヽ
┌|(⌒ヽ :|| ..:⌒: |┐ / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|::|::ヽ.__:):||(___ノ ::|::| │
|:|: .. :|| .. |:| │
:|: .. || ..|| < ジュワ!
:\ [_ ̄] /::| │
:: |\|_|_|_|_/:::| \________
2 名前:('A`) 2005/05/20(金) 21:06:49
ジュワワワジュワワ、
ジュワジュワジュジュワワワワワ?
3 名前:('A`) 2005/05/20(金) 21:07:27
/ || :ヽ
┌|(⌒ヽ :|| ..:⌒: |┐ / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|::|::ヽ.__:):||(___ノ ::|::| │
|:|: .. :|| .. |:| │
:|: .. || ..|| < >>2日本語でおk
:\ [_ ̄] /::| │
:: |\|_|_|_|_/:::| \_______
0550542
2006/07/17(月) 11:11:26ID:???通常は素直に動く事は解っています。NULLを0と等価とみなし、
オブジェクトではフィールド数を返すなど。
ただ、たまーに変になる可能性がちょっとでもあるのかな?
と言うことが知りたかったというか、ごめんよ日本語下手で。
まずは日本語を勉強しろって事だな。正直スマンカッタ
0552nobodyさん
2006/07/17(月) 11:14:12ID:???0553nobodyさん
2006/07/17(月) 11:31:29ID:???>>542の場合、$startに数字じゃなく文字が入ったりすると永久ループする可能性があるけどね。
これが本当に$startはcount()の結果以外は入らないようになってるのならちょっと分からんけど。
他にあるとしたらループの中で$tempを破壊してしまうケースくらいか。
ま、ifは変な挙動をしたりしない。
しかしPHPの変数が様々な型を自動変換するのをプログラマが忘れてることは多い。
変な挙動に見えても大抵はそれは「仕様」だ。
0554nobodyさん
2006/07/17(月) 11:34:11ID:???>>542では、終了の値が有限であり、(ファイル名がもの凄い長いとかじゃないです)
かつ、開始の値に関数 count() を利用する為、負の値は通常取らないはず。
この条件でどうして無限ループが発生したのかが疑問なんです。
Nullチェックなりなんなりしろってことは、count() は極稀に負の値を
返したりする事がある。って事かな?
その場合、IFの開始、終了値の制限範囲を予め定めるってチェックを
する必要があるけど、それって普通しないですよね?
ただの事故か、それとも潜在的に無限ループの可能性があるのかが知りたかっただけなんです。
0556nobodyさん
2006/07/17(月) 11:40:14ID:???0557nobodyさん
2006/07/17(月) 11:50:47ID:???あ、そうか。ありがとうございます。かなり参考になりました。
変数の型には留意しているつもりなんですが、やっぱり見えないところで
いろいろ変換されているかもしれません。
>>556
ループ処理はこれだけだったんです。
変数代入は IFの直前で他の値が入る隙はなかったんです。
一番可能性が高いのは、処理中に $temp に何かいれた。かな?
(無論、そんな事はしていないつもりですが)
再現性が殆ど皆無である為、ただの事故だったかも知れませんが
変数の型に常に留意しなければならないなど、いろいろ参考になりました。
ありがとうございました。
0558nobodyさん
2006/07/17(月) 11:52:27ID:???0559nobodyさん
2006/07/17(月) 12:07:52ID:???スクリプトって寛大に受け入れてとりあえず動いてくれるけど、
それが難しく感じる事の方が個人的には多い。
現実的で有効な対処法は、ソースを第三者にみて評価してもらうかな。
愚問に付き合ってくれて、みなさんありがとうございました。
0560nobodyさん
2006/07/17(月) 12:47:23ID:???<form method = "POST" action = "test.php">
<input type = "checkbox" name = "type" value = "a=4,b=7" checked>良かった<br>
<input type = "checkbox" name = "type" value = "b=2,c=3" >悪かった<br>
<input type = "checkbox" name = "type" value = "c=3" >その他
<input type ="submit" value="投稿する"><br>
</form>
フォームを作っているのですが
一つのチェックボックスに複数の数値を持たせたいのですが
どのようにしてPHPは処理すればいいでしょうか?
0561nobodyさん
2006/07/17(月) 13:11:17ID:???0562nobodyさん
2006/07/17(月) 13:18:46ID:???$type = array();
foreach(explode(",", $_POST['type']) as $t) {
list($k, $v) = explode("=", $t);
$type[$k] = $v;
}
これでa=4,b=7を選択すると
$type['a'] = 4
$type['b'] = 7
の状態になると思う。
>>561
このくらいふつーだろ。
0564nobodyさん
2006/07/17(月) 15:33:09ID:???仮に処理できるとしても、そんなクソな設計は止めたほうがいい。
複数の値を持たせなきゃならん必要性があるのか?
0565560
2006/07/17(月) 16:19:00ID:ab1cz1rX例えば良かったと悪かったが選択されていたら
a=4,b=9,c=3となるようにしたいです。
そして、それぞれのa,b,cの値によって次の処理をしたいのですが
考え方が間違っているのでしょうか?
0566560
2006/07/17(月) 16:24:35ID:ab1cz1rXこれらは例ですので気にしないでください。
混乱させてしまったらごめんなさい。
0567nobodyさん
2006/07/17(月) 16:25:43ID:???<input type = "checkbox" name = "type" value = "1" checked>良かった<br>
<input type = "checkbox" name = "type" value = "2" >悪かった<br>
<input type = "checkbox" name = "type" value = "3" >その他
リンク先のページで、
if( $_POST['type']==1){
$a=4;
$b=9;
$c=3;
}elseif(なんたら)
ってかんじがいいと
0568nobodyさん
2006/07/17(月) 16:30:20ID:???<input type = "checkbox" name = "type" value = "a=4,b=3,c=5" checked>良かった<br>
$tmp = explode( ',', $_POST['type']);
foreach( $tmp as $val){
$aaaa = explode( '=', $val);
print_r( $aaaa);
}
0569nobodyさん
2006/07/17(月) 16:31:47ID:???$tmp を無意識に「ドル、ティムポ」って読んじゃうのもれだけ?
0570560
2006/07/17(月) 16:33:53ID:ab1cz1rX速レスありがとうございます。
PHP初心者で、>>567が自分の作ろうとしているものに適しているのかどうか
よくわからないので、localhostで試してからまた来ます。
0571nobodyさん
2006/07/17(月) 16:34:15ID:???再構成できるんだから>>560みたいなやり方も一概に悪いとは言えないと思う。
たとえばaとかbとかのキー自体がiniファイルで外部設定できるような仕組みになってれば、
いちいちプログラムを変えなくても様々なニーズに容易に対応できるようになるだろ?
0573nobodyさん
2006/07/17(月) 16:47:57ID:???name = "type[]"
にして複数のチェックボックスを配列にするといいかも。
0574560
2006/07/17(月) 16:59:52ID:ab1cz1rXすいません。勉強不足で何のことやらさっぱりです。
>>573
>なんとか診断みたいなやつかな? 設問がたくさんあるタイプのやつ。
ズバリそれです。
>name = "type[]"
>にして複数のチェックボックスを配列にするといいかも。
これもよくわかりません。
0575nobodyさん
2006/07/17(月) 17:02:26ID:???0576nobodyさん
2006/07/17(月) 17:03:28ID:???…なんできみわ"a=4,b=7"みたいな変なパラメータを指定できるようにしたいなんて思ったのかね
チェックボックスで複数指定できるようにするならname="type[]"としとかないと
複数のパラメータを受け取れないぞ。最後の1個で上書きされてしまう。
name="type"にして選択できるのはどれか1つ、ってするならtype="radio"だろ。
0577560
2006/07/17(月) 17:05:47ID:ab1cz1rX<?php
if( $_POST['type'] == 1 ){
$a=4;
$b=9;
$c=3;
}elseif( $_POST['type'] == 2 ){
$a=1;
$b=2;
$c=3;
}
echo "$a"
?>
これだと、$aはelseifの値をとってしまいます。
二つの数値を足したいのですが、どうすればいいでしょうか?
0579nobodyさん
2006/07/17(月) 17:13:11ID:???まず複数指定できるようにするなら
<input type = "checkbox" name = "type[]" value = "a=4,b=7" checked>良かった<br>
<input type = "checkbox" name = "type[]" value = "b=2,c=3" >悪かった<br>
<input type = "checkbox" name = "type[]" value = "c=3" >その他
とnameのとこに[]をつけてパラメータを配列で受け取れるようにせんと。
すると複数にチェックした場合
$_POST['type'][0] = "a=4,b=7"
$_POST['type'][1] = "b=2,c=3"
のようにセットされるようになる。
name="type"にしちゃうと2つ選択しても
$_POST['type'] = "a=4,b=7"
という値が、後ろに続いた
$_POST['type'] = "b=2,c=3"
で上書きされてしまって、結果として
$_POST['type'] = "b=2,c=3"
しかデータ自体が残らないんだから、プログラム上で足そうと思っても足しようがない。
あとは配列を順番に処理するだけだから、ちょっと考えてみれ。
0580nobodyさん
2006/07/17(月) 17:13:35ID:???たとえばhtmlのフォームのところで
<input type="checkbox" name="type[]" value="1">回答1<br>
<input type="checkbox" name="type[]" value="2">回答2<br>
<input type="checkbox" name="type[]" value="4">回答3<br>
<input type="checkbox" name="type[]" value="8">回答4<br>
ってやっておくと、submitで飛んだ先のphpで
foreach($_POST['type'] as $cb){
echo "$cb<br>" ;
}
とか出来るので便利。
あとは>>562と組み合わせるといいよ。
■ このスレッドは過去ログ倉庫に格納されています