- 締切済み
連想配列の処理
こんにちは。 MySQL 4.1.22 と PHP 4.4.7 でプログラムを組んでいて、こちらではいつも皆様の知識と経験を参考にさせていただいております。 今回、どうしても超えられない壁に当たってしまいコーディングが止まってしまったので力をお貸し下さい。 今取り組んでいるプログラムは、複数の<checkbox>から選択した値を受け取って、マスターテーブルに検索を掛けて、返った値を表示した後、確認ボタンで別のユーザーテーブルに値を格納するというものです。 *** プログラムの流れ **** input.php(入力ページ:checkbox ) ↓ view.php (確認ページ:CC_master.tbl) ↓ regist.php (登録ページ:user_master.tbl) input.php から値を取得して、 CC_master.tbl に検索・値の取得までは出来たのですが、取得した値を別の形に整形するところでつまづいてしまいました。 //--- input.php --- //--- 実際には 99個の checkbox がある訳ではありません。^^; <form name="form" method="POST" action="view.php"> <input type="checkbox" name="cc[]" value="1">50cc <input type="checkbox" name="cc[]" value="2">80cc <input type="checkbox" name="cc[]" value="3">125cc <input type="checkbox" name="cc[]" value="4">200cc <input type="checkbox" name="cc[]" value="5">250cc <input type="checkbox" name="cc[]" value="6">400cc ・ ・(中略) ・ <input type="checkbox" name="cc[]" value="99">その他 <input type="submit" name="exec" value="排気量の確認"> </form> //--- END Code --- //--- view.php --- //--- チェックされた排気量コードを CC_master.tbl に対して検索をかける //---例:1番、2番、6番にチェックを入れたとして... //---具体的な排気量を「 50cc 80cc 400cc 」の様に一列、スペース区切りで変数($cc_name)に格納、表示 $arr_cc = $_POST["cc"]; if(isset($arr_cc) and count($arr_cc) > 0){ $val = ""; for($i=0; $i<count($arr_cc); $i++ ){ if($i == 0){ $val .= $arr_cc[$i]; }else{ $val .= "," . $arr_cc[$i]; } } } $res = mysql_query("select * from CC_master where id in ('$val')"); while($row = mysql_fetch_array($res)){ # #ここで配列からフィールド:cc の値のみを取り出して、変数 $cc_name に格納。 # } ecoh $cc_name; //--- END Code --- //--- regist.php --- //--- $cc_name の値をINSERT文で user_master.tbl に登録。 現在、上記のように考えていますが、どうしても変数 $cc_name に意図した形で値を格納できません。 $val に値を入れる要領で処理すればOKだと思うのですが、while( )、for( )、foreach( ) のどれを使っても上手くいきません。連想配列となる $row["cc"] の扱い方(整形方法)がどうしても解らないで助けて下さい。 宜しくお願いします。 //--- CC_master.tbl --- CREATE TABLE `CC_master` ( `id` int(2) NOT NULL default '0', `cc` varchar(10) NOT NULL default '', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=ujis; INSERT INTO `CC_master` (`id`, `cc`) VALUES (1, '50cc'), (2, '80cc'), (3, '125cc'), (4, '200cc'), (5, '250cc'), (6, '400cc'), ・ ・(中略) ・ (99, 'その他');
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- wp_
- ベストアンサー率54% (132/242)
とりあえず連想配列のloop方法でよいのでしょうか。 $moge = array( "ore"=>"husahusa" ,"butyou"=>"hage" ); foreach($moge as $key => $value) { echo $key." :: ".$value."<br />\n"; } 直接は関係ないですが、 if(isset($arr_cc) and count($arr_cc) > 0){ $val = ""; for($i=0; $i<count($arr_cc); $i++ ){ if($i == 0){ $val .= $arr_cc[$i]; }else{ $val .= "," . $arr_cc[$i]; } ↓ $val = join(',', array_values($arr_cc) ); とすることが出来ます。
- yambejp
- ベストアンサー率51% (3827/7415)
真剣にみてないので迂闊なことはいえませんがちょっと気になったてん・・ for($i=0; $i<count($arr_cc); $i++ ){ if($i == 0){ $val .= $arr_cc[$i]; }else{ $val .= "," . $arr_cc[$i]; } } の箇所を、 foreach($arr_cc as $value){ $val .=($val==""?"":"','").$value; } としてください。 そもそもforはまずいでしょう。連番で入っているわけではないので 抜け番まで探しにいってます。 SQL文で "select * from CC_master where id in ('$val')" となっているので、たとえば1,2,3が対象だと in ('1,2,3')になってしまいます。 これでは1も2も3もヒットしませんね。 したがって$valをつなぐときにセパレータを','としておけば in ('1','2','3')となりヒットさせることが可能です。
お礼
yambejp様の仰る通り、この場合は $val の値を for( ) ではなく foreach( ) で取得するのが正解ですね。最初は私もそう思ったのですが、意図した値が for( ) で取れたのでそのまま使っていました。 自分の引き出しの少なさを改めて痛感しました。(汗) ご指摘を受け、SELECT文の ('$val') を ($val) として yambejp様にご教授いただいた foreach( ) を以下の様にいたしました。 foreach($arr_cc as $value){ $val .=($val==""?"":",").$value; yambejp様、貴重なご意見ありがとうございました。
お礼
wp様、お世話になります。 >$val = join(',', array_values($arr_cc) ); >とすることが出来ます。 こういう処理の仕方もあるのですね。勉強になりました。 while( )文の外で $cc_name の値が取れなかったのですが、難しく考え過ぎていたようです。 配列の関係を再度確認して、何とか意図した形で変数に格納出来るようになりました。 //---view.php(全角インデント) $res = mysql_query("SELECT cc from CC_master WHERE id in ($val)"); while($row = mysql_fetch_row($res)){ foreach($row as $val_cc ){ $cc_name .= $val_cc." "; } } echo $cc_name; //--- END CODE 表示結果:50cc 80cc 400cc もっと良い書き方が有るのかもしれませんが、それは自分への宿題とします。^^; ありがとうございました。