【PHP】下らねぇ質問はここに書き込みやがれ 28
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/09/03(日) 21:01:08ID:???まず読め→【PHP マニュアル】http://www.php.net/manual/ja/
PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。
過去スレ、関連スレ、FAQなどは>>2-10辺り
◆質問する場合の注意
1. 自分のIDを表示させること。(メール欄に何も記述しないでください)
2. サーバーのOS、WebサーバーとPHPの種類やバージョン等を明記すること。
3. 己の行った操作、変更などを詳しく明記すること。
4. エラーメッセージはそのまま表記すること。「エラーが出ます」では絶対分かりません。
5. 質問者としても態度をわきまえること。
6. 事前に公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
◆質問後の注意
・質問者は必ずIDを表示させてください。(メール欄に何も記述しないでください。)
・2回目以降は最初に質問した際のレス番号を名前欄に入れてください。
(逆に回答者は質問者に対して>>(アンカー)をつけて答えてください。)
・解決しなくても回答をもらった場合はお礼を言う。
(荒らし、煽りは除く。逆に煽られたときも、無闇に反論せずスルーすべし)
【その他諸注意】
・正規表現・PEAR・テンプレート(Smarty等)・フレームワークはそれぞれの該当スレへ
・SQLについての質問はデータベース板(PCカテゴリ)の各スレで
・オブジェクト指向については良スレがないから本を買え。理解できないならムリに使うな。
・速さについては自分でベンチをとってここに書け(違う環境の人も調べてくれるかも)
0478nobodyさん
2006/09/10(日) 02:23:13ID:???並び替えた内容も見ないと断定はできないけど、
多分 if($s[1] < 0) を前に置いたんだろ?
-5より小さい値なら当然0よりも小さいわけだから
まずそっちに該当しちゃうだろ。
もうちょっと論理的に物事を考えないとプログラマにはなれないよ。
0479nobodyさん
2006/09/10(日) 02:30:01ID:???0480nobodyさん
2006/09/10(日) 02:38:46ID:???0481nobodyさん
2006/09/10(日) 02:39:37ID:???勘違いしてるかもだけど、
if(条件A) {
} elseif(条件B) {
}
ってのは条件AとBをいっぺんに調べてくれるものじゃなくて、
まずAを調べてそれに該当しない場合のみBを調べるもの。
Aに該当してしまったらBはもう調べてくれない。
0482nobodyさん
2006/09/10(日) 02:41:28ID:???0483nobodyさん
2006/09/10(日) 02:42:27ID:???ソースをちゃんと晒すところが良いね。
ソースも出さずに分からない!って奴が多すぎる
0486nobodyさん
2006/09/10(日) 05:38:40ID:???と聞こうと思ったら「number_format()」なんて便利な関数があったのですね。
ちなみにこれが無い場合どのようなやり方が効率が良いでしょうか。
自分は今金額の長さを最初に図ってifで条件分岐させようと思っていました。
3で割って1余るとき2余るときそれ以外の3種類です。(先頭から区切るので余る桁でコンマの打ち方を変えてます)
0487nobodyさん
2006/09/10(日) 05:42:31ID:???number_format()のあるPHPでそんなこと考えたこともなかったけど、
あえて必要が出たら
ttp://www.din.or.jp/~ohzaki/perl.htm#NumberWithComma
を移植すると思う。
0488nobodyさん
2006/09/10(日) 07:34:35ID:???0489nobodyさん
2006/09/10(日) 09:19:06ID:???0490nobodyさん
2006/09/10(日) 10:03:44ID:zVKYsOR20491nobodyさん
2006/09/10(日) 10:21:56ID:???0494486
2006/09/10(日) 10:57:59ID:???0495nobodyさん
2006/09/10(日) 11:04:57ID:vRp21kRkで、ローカルでテストしてみたのですが、ブラウザに書き込んだ内容が表示されません。
どなたかどうやったら表示されるようになるか、教えてください。
0496nobodyさん
2006/09/10(日) 11:09:43ID:???0497nobodyさん
2006/09/10(日) 11:17:29ID:???0500クダラナェ質問です。
2006/09/10(日) 13:28:06ID:???$Result=array();
$Data=file("商品.csv");
for($i=0;$i<sizeof($Data);$i++){
$lines=strip_tags($Data[$i]);
$Match=true;
現在の「商品.CSV」からの全体のデータではなく、$line[0]と$line[30]のデータ内のみから
検索データを抽出したいのですが、どうすればいいのでしょうか?
0502nobodyさん
2006/09/10(日) 13:46:34ID:???0、30用のループを別に用意するとか
ループを一つにして if($i != 0 && $i != 30) continue; とskipするとか
0503nobodyさん
2006/09/10(日) 14:09:50ID:QbCxbqAn$a = array(
array(1,2,3),array(1,3,2),
array(2,1,3),array(2,3,1),
array(3,1,2),array(3,2,1)
);
print_r($a);
foreach($a as &$b){
array_push($b,$b[0]);
}
print_r($a);
foreach($a as $b){
foreach($b as $c){
echo $c;
}
echo '<br/>';
}
?>
1から3までの順列を定義し、さらにその末尾に最初の値を付けた数列を得ようとしています。
しかしこれを実行すると
1231
1321
2132
2312
3123
3123
と何故か最後の1つだけ最後から2番目の数列と同じ値になってしまいます。
foreachで$bを参照にしている影響だと思いますが($bの変数名を変えればうまくいきます)、
どういう原因でこうなるんでしょうか?
0504nobodyさん
2006/09/10(日) 14:44:12ID:???最初のforeachループが論理的には
$b =& $a[0]; array_push($b,$b[0]);
$b =& $a[1]; array_push($b,$b[0]);
$b =& $a[2]; array_push($b,$b[0]);
:
:
$b =& $a[5]; array_push($b,$b[0]);
というふうに展開されるので、以降は$bは「$aの最後の要素」のエイリアスとして機能する。
これを避けるには、ループの直後でunset($b);をやる。
0505nobodyさん
2006/09/10(日) 15:10:31ID:???for($i=0;$i<=30;$i++){
array_push($Result, "ageてIDを出せこのやろう");
}
$search = array(0,30);
for($i=0;$<=sizeof($Data);$i++){
if(!in_array($i,$search)) continue;
echo("それともこうか?このやろう");
}
0506nobodyさん
2006/09/10(日) 16:01:48ID:QbCxbqAnなるほど内部ではそんなことになってたんですね。
どうもありがとうございました。
0507nobodyさん
2006/09/10(日) 16:04:12ID:???自分の理解出来る方法で試行錯誤してみたほうがいいのでは
0508nobodyさん
2006/09/10(日) 16:21:23ID:???入力→確認→処理
という流れが多いので、
確認の部分をフレームワークの中に組み込みたいんですが、
どこに組み込めばいいんだろう。
0510nobodyさん
2006/09/10(日) 16:25:20ID:???0511nobodyさん
2006/09/10(日) 16:27:28ID:???0512nobodyさん
2006/09/10(日) 16:28:35ID:???フレームワークの話はこちらで。
[PHP]フレームワークについて語るスレ4[総合]
http://pc8.2ch.net/test/read.cgi/php/1151706907/
0513nobodyさん
2006/09/10(日) 16:28:58ID:???>>504的な動作に自力で気付くのはなかなか難しいと思われ
大抵は原因を追求する前に諦めて別の実装を探すからな
その点理由を探してる>>503は見込みがある
0514508
2006/09/10(日) 16:39:06ID:???0515nobodyさん
2006/09/10(日) 16:58:17ID:vRp21kRk0516nobodyさん
2006/09/10(日) 17:15:10ID:???自分で&付けてるんだから普通にわかるだろ
$thisを通してるケースは嵌るけど
『$this は 常にコール側のオブジェクトへのリファレンスです』
0517nobodyさん
2006/09/10(日) 17:25:46ID:???自分で書いたのに分からないってのは・・
0518nobodyさん
2006/09/10(日) 17:27:48ID:???参照つけたループ変数を同名で後から使うほうが悪いってのもあるけど、ループ抜けたあとまでエイリアスとして働き続けるってのは、いざバグったときにかなり発見しづらいと思う。
しかも参照してる対象が、foreachに使った配列の最後の要素と来たもんだ。
0520513
2006/09/10(日) 17:54:04ID:???0521nobodyさん
2006/09/10(日) 18:29:53ID:???ってでますけどどこかおかしいですか↓
for($n=0;$n<sizeof($ArrKeyword);$n++){
if(!eregi($ArrKeyword[$n],$lines)){
$Match=false;
break;
0523nobodyさん
2006/09/10(日) 18:50:38ID:???そういうときはeregiに何が渡されるかを(echo等で)取得してeregi一文で試すんだよ。
こういったことを繰り返せば問題解決する。
0526521
2006/09/10(日) 19:49:38ID:???0527nobodyさん
2006/09/10(日) 20:07:28ID:R17hn9Opmb_send_mailで送るメール本文に上で揃えたものをつけてもずれてしまいます。
どうしたらよいのでしょうか?
例 ↓の円を揃えたい
+消費税 ?円
+送料 ?円
?の所は桁が変わるので +消費税".str_pad(number_format($money),15," ","str_pad_left")."円等とやってます。
0529527
2006/09/10(日) 20:15:43ID:R17hn9Opstr_pad(number_format("+消費税".$money),15," ","str_pad_left")."円
な感じでやってます。
あとメール本文だけじゃなくて普通に表示しても駄目でした
0531nobodyさん
2006/09/10(日) 20:28:51ID:???っていうかお前
number_format("+消費税".$money)
の部分おかしくね?
よく分かんないなら
str_pad と number_format を切り離して考えて味噌
というよりmoney_formatのほうがいいんじゃ
0532nobodyさん
2006/09/10(日) 22:05:20ID:???教えてるやつらも低レベルやし。 まじ笑えるw
ここみるとPGとして優越感にひたれるから好きw
0533nobodyさん
2006/09/10(日) 22:54:19ID:???自分はレベル低いですって言ってるようなもんだよ。
0534(^ω^) ◆shPHP/.kPI
2006/09/10(日) 22:55:25ID:???0535nobodyさん
2006/09/10(日) 23:29:35ID:???0536521
2006/09/10(日) 23:49:51ID:VGwX15XGわけワカメなのは何度かリロードするとちゃんと検索結果が出てくるんですよ
なんなんでしょ?
0539nobodyさん
2006/09/11(月) 00:17:49ID:Os5jvMFzリロードすると問題なく検索結果が反映されるので、値は入ってると・¥・
$lines=strip_tags($Data[$i]);
if(eregi($KeyWord,$lines)){
array_push($Result,$Data[$i]);
こうすると問題ないのですが、1語でしか検索できずまいります。
0540nobodyさん
2006/09/11(月) 00:26:24ID:???おい、話が変わってるんじゃない?
「一回リロードするとOK」なのか「何回かリロードすると偶発的にOK」なのかハッキリしろ
しかも>>521のソースにはstrip_tagsもarray_pushも入ってないだろ
それにちゃんとechoで値をチェックしたのか?値が入っていたらちゃんとそのif文に引っかかるんだろ?
0541nobodyさん
2006/09/11(月) 00:32:43ID:Os5jvMFzオリジナルは↓
$KeyWord=$_GET["key"];
$KeyWord=htmlspecialchars($KeyWord);
$KeyWord=mb_convert_encoding($KeyWord,"EUC-JP","auto");
$KeyWord=mb_convert_kana($KeyWord,s);
$ArrKeyword=explode(" ",$KeyWord);
$Result=array();
$Data=file("ほげほげ.csv");
for($i=0;$i<sizeof($Data);$i++){
$lines=strip_tags($Data[$i]);
$Match=true;
for($n=0;$n<sizeof($ArrKeyword);$n++){
if(!eregi($ArrKeyword[$n],$lines)){
$Match=false;
break;
}
これで「何回かリロードすると偶発的にOKです」。 それと時折文字化けします。
でっ、↑を
$lines=strip_tags($Data[$i]);
if(eregi($KeyWord,$lines)){
array_push($Result,$Data[$i]);
に変えると1語でしか検索できませんが、文字化けも、エラーもでません。
がっ、1語でしか検索できず困ります。
0542nobodyさん
2006/09/11(月) 00:43:57ID:???var_dump($ArrKeyword);
0543nobodyさん
2006/09/11(月) 00:44:02ID:???いくつか間違いがあるぞ
$KeyWord = mb_convert_encoding($KeyWord,"EUC-JP","auto");
まずこれ。mb_convert_encodingの第2引数にautoを入れると環境によって何故か上手く動かないことがある。
だからちゃんと文字コードを指定すること。「偶発的に〜」って部分は多分これのセイだと思う。
あとmb_convert_kana($KeyWord,s)、こいつの第2引数は本当にこの書き方で良いのか?
ちょっとマニュアルで確認してみろ
0545543
2006/09/11(月) 01:26:28ID:???×mb_convert_encodingの第2引数にauto
○mb_convert_encodingの第3引数にauto
だった
0546nobodyさん
2006/09/11(月) 01:33:52ID:???$KeyWord=mb_convert_kana($KeyWord,s);
に問題ないとおもわれw
0548nobodyさん
2006/09/11(月) 01:40:15ID:???> $KeyWord=mb_convert_kana($KeyWord,s);
> に問題ないとおもわれw
本気で言っているのか?
0550nobodyさん
2006/09/11(月) 01:49:02ID:???0551nobodyさん
2006/09/11(月) 01:55:01ID:???0552nobodyさん
2006/09/11(月) 01:59:57ID:???関数はその関数のみでテストしてから使おう。
0554nobodyさん
2006/09/11(月) 02:14:11ID:???しばらく待ってあげてください。w
0555nobodyさん
2006/09/11(月) 02:18:12ID:???他の板じゃまず考えられない。
そして人間のレベルが高い。センスもまあまあ。
プログラマは遊び心ある日とが多いかも分からんからね
俺はここで筆問して解決できなかったことが無いんだもんね
0557nobodyさん
2006/09/11(月) 02:29:28ID:???0558nobodyさん
2006/09/11(月) 02:33:39ID:???0559nobodyさん
2006/09/11(月) 02:58:21ID:???寝よっと
0560nobodyさん
2006/09/11(月) 03:07:32ID:???0563560
2006/09/11(月) 03:42:37ID:???0564nobodyさん
2006/09/11(月) 03:56:28ID:???文字コード関係の問題だった・・変換して受け渡しやったら正常に動いたよ。
スレに聞きに来る皆も、うっかり指定し忘れたりしないように気を付けよう orz
とまぁこういうわけで、聞こうか悩みながらやってたら自力解決したし寝るノシ
0565nobodyさん
2006/09/11(月) 04:18:14ID:???ホントにそれ普通のリロードなのかな…
原因自体はkeyってパラメータの末尾に空白がくっついちゃってるかどうかだと思うんだけど。
> $ArrKeyword=explode(" ",$KeyWord);
ここで空白区切りで検索キーワードを分解してるけど、これだと末尾に空白があると
$ArrKeywordの最後の項目が "" っていう空っぽの単語になっちゃうでしょう。
> eregi($ArrKeyword[$n],$lines)
eregの検索キーワードで「空っぽ」ってのは許容されず、
> Warning: eregi() [function.eregi]: REG_EMPTY
のエラーが出ちゃうので、事前に空っぽデータが無いかチェックしないといけない。
あと他に、完全な空っぽでなく正規表現として不正なキーワードになってる可能性もある。
文字列に[だけ含んで]が無いとか、\を含んじゃってるとか。
正規表現として正しくないとやっぱりエラーになるので、ユーザが自分で検索キーを
入力するようなプログラムで検索にeregを使うのは良くないよ。使うならquote_meta()せんと。
正直、このプログラムなら
> if(!eregi($ArrKeyword[$n],$lines)){
は
if($ArrKeyword[$n] != '' && strpos($lines, $ArrKeyword[$n]) === FALSE) {
の方が適切なんじゃなかろうかと思うんだが。
検索キーワードにそんな変な記号は含んでない!という場合でも、
Shift_JISで漢字の中に正規表現記号を含んでしまっている場合がある。
> $KeyWord=mb_convert_encoding($KeyWord,"EUC-JP","auto");
でeuc変換してるはずだから大丈夫!と思ってても、元のキーワードが短いと
文字コード判定に失敗してしまって変換されないケースがあるので危険。
0566nobodyさん
2006/09/11(月) 11:17:31ID:???$Keywd=htmlspecialchars($_GET['key']);
$Keywd=mb_convert_encoding($Keywd,"auto");
$Keywd=mb_convert_kana($Keywd,"s", EUC-JP");
$Keywd=ereg_replace("and"," ",$Keywd);
$Keywd=ereg_replace(" "," ",$Keywd);
$Data=file("item.csv");
?>
<?php
if($Keywd!=""){
$Result = array();
for($n=0;$n<sizeof($Data);$n++){
$line=explode(",",$Data[$n]);
$arrSentence = strip_tags($Data[$n]);
$arrKeyword = explode(" ",$Keywd);
for($i=0; $i<sizeof($arrKeyword); $i++) {
$flgMatched = true;
if(!eregi($arrKeyword[$i], $arrSentence)) {
$flgMatched = false;
break;
.......
if($flgMatched) {
array_push($Result, $Data[$n]);
..
コピペだけどこっちのほうがいいんじゃない?
0567nobodyさん
2006/09/11(月) 11:29:06ID:???あとは先頭に
mb_regex_encoding("EUC-JP");
してみるとか。
0568nobodyさん
2006/09/11(月) 12:11:20ID:???541と566の構文ではどっちがいいのでしょうか?
0571568
2006/09/11(月) 12:31:59ID:???PHPの勉強もかねて、まずはコピペからでもはじめたいのですが、
もしまともなコードがあるならソースを教えてもらえないでしょうか?
ちなみに検索したらばっちり541と566を見つけられましたが、なかなか
他がないです。
0572nobodyさん
2006/09/11(月) 12:55:10ID:???0573568
2006/09/11(月) 13:19:05ID:???0574nobodyさん
2006/09/11(月) 13:25:55ID:???お手本を丸ごと「書写(自らタイプ)」するなら、たしかに一定の勉強効果はある。
しかし「コピペ」するなら、全く勉強にならない。
0575500
2006/09/11(月) 13:36:55ID:???$Result=array();
$Data=file("商品.csv");
for($i=0;$i<sizeof($Data);$i++){
$lines=strip_tags($Data[$i]);
$Match=true;
現在の「商品.CSV」からの全体のデータではなく、$line[0]と$line[30]のデータ内のみから
検索データを抽出したいのですが、どうすればいいのでしょうか?」
if($i != 0 && $i != 30) continue;
for($i=0;$i<=30;$i++){
? array_push($Result, "ageてIDを出せこのやろう");
}
$search = array(0,30);
for($i=0;$<=sizeof($Data);$i++){
? if(!in_array($i,$search)) continue;
? echo("それともこうか?このやろう");
}
などいろいろご回答ありがとうございました。
ただ、行データの$line[0]と$line[30]ではなく、列のデータの$line[0]と$line[30]なんですが、
特定の列のデータを抽出するにはどうしたらよいでしょうか?
0576nobodyさん
2006/09/11(月) 14:05:40ID:???$Match=true; っていうのは流行なのか
てっきり同じ人だと思ってたが
とりあえずfgetcsvでも使って評価してみたら?
0577nobodyさん
2006/09/11(月) 14:10:51ID:???あんたは全く理解してないから、まずは簡単なことからしたら?
たとえば、
1.商品データの三行目の二列目を$aに入れてみる。
2.1が出来たら、次は全部の行の二列目を$a[]に入れてみる。
3.2が出来たら、次は全部の行の二列目が1(←なんでもいい。完全一致==で)のものを$a[]に入れてみる。
4.3が出来たら、最後に全部の行の任意の列に文字列$keyが含まれるものを$a[]に入れてみる。
これくらい順序踏めば、頭の悪いあんたでもわかるんじゃね?1すらできないなら諦めるべきだな。
■ このスレッドは過去ログ倉庫に格納されています