function が動かない理由がわかりません。
$event_ary = array(
array("地元","jimoto"),
array("農協","nokyo"),
array("西地区","nishi_chiku"),
array("みなと","minato"),
array("助六地区","sukeroku"),
array("三四軒屋","sanshikenya")
);
function selectOptEvent(){
$ary_count = count($event_ary);
for($k = 0; $k < $ary_count; $k++){
print("<option value='".$event_ary[$k][1]."'>".$event_ary[$k][0]."</option>");
}
}
$now_year = date(Y);
function selectOptNumber($start,$end){
for($j = $start; $j <= $end; $j++){
print("<option value='".$j."'>".$j."</option>");
}
}
----------以下html部----------
-略-
<select name="event_name"><?php selectOptEvent(); ?></select> <select name="event_year"><?php selectOptNumber(1991,$now_year); ?></select>年 <select name="event_month"><?php selectOptNumber(1,12); ?></select>月 <select name="event_date"><?php selectOptNumber(1,31); ?></select>日
-略-
上記2つの function があって、下(selectOptNumber)は動き、上(selectOptEvent)は動きません。
何が原因なのかさっぱりわかりません。
タイプミスでなく、仕様であればその記述のURL(・・・日本語で)が欲しいです。
error_reporting(E_ALL); ini_set("display_errors", DEBUG);
をスクリプトの先頭にでも入れておくと、不用意なミスを(鬱陶しい程)キッチリ報告してくれます。
開発中はこうしておくとよいのでは?
さて問題は、変数のスコープだと思います。
function selectOptEvent(){ $ary_count = count($event_ary); for($k = 0; $k < $ary_count; $k++){ print("<option value='".$event_ary[$k][1]."'>".$event_ary[$k][0]."</option>"); } }
これだと、関数 selectOptEvent() の中では、$event_ary が未定義のままででは?
(関数定義の前というか関数の外で定義しているので)
$event_array を関数外で定義する必要があるなら
現状では引数がないので、
function selectOptEvent($evnary){ $ary_count = count($evnary); for($k = 0; $k < $ary_count; $k++){ print("<option value='".$evnary[$k][1]."'>".$evnary[$k][0]."</option>"); } } のように引数で渡してやる事にして、呼び出し時は selectOptEvent($event_ary); とするとか function selectOptEvent(){ global $evnary; $ary_count = count($evnary); for($k = 0; $k < $ary_count; $k++){ print("<option value='".$evnary[$k][1]."'>".$evnary[$k][0]."</option>"); } } のように global でグローバルスコープの変数であると宣言するかだと思います。
関数外で定義する必要がなければ、
function selectOptEvent(){ $event_ary = array( array("地元","jimoto"), array("農協","nokyo"), array("西地区","nishi_chiku"), array("みなと","minato"), array("助六地区","sukeroku"), array("三四軒屋","sanshikenya") ); $ary_count = count($evnary); for($k = 0; $k < $ary_count; $k++){ print("<option value='".$evnary[$k][1]."'>".$evnary[$k][0]."</option>"); } }
のように $event_ary の定義を関数内に移すとか。
$event_any は関数の中からは見えません。global してやってください。
<?php function selectOptEvent(){ global $event_ary; //←コレを追加 $ary_count = count($event_ary); for($k = 0; $k < $ary_count; $k++){ print("<option value='".$event_ary[$k][1]."'>".$event_ary[$k][0]."</option>"); } } ?>
独学で作っていった中でこんなスコープの問題にはじめて当たりました。
ありがとうございます。
$event_ary はグローバル変数であり、関数 selectOptEvent からは見えないためです。
次のようにすると動作すると思います。
<?php function selectOptEvent(){ global $event_ary ; // この行を追加 $ary_count = count($event_ary); for($k = 0; $k < $ary_count; $k++){ print("<option value='".$event_ary[$k][1]."'>".$event_ary[$k][0]."</option>"); } }
上の方と同じですね。
ありがとうございます。
http://www.komonet.ne.jp/~php/chap9.htm
変数のスコープの問題です。
$event_aryはfunction selectOptEventの中に届いていません。
仕様と言えばもちろん仕様ですが、PHPに限らずまず確認しておくべき基礎の基礎かと思います。
基礎の基礎。
こういうものが独学というか、素人がいきなり作っていくなかでは躓かないとなかなかわかりません。
こんなご指摘で、マニュアルを読み始めるきっかけになります。(部分だけですが・・・)
ありがとうございます。
error_reporting(E_ALL); ini_set("display_errors", DEBUG);
をスクリプトの先頭にでも入れておくと、不用意なミスを(鬱陶しい程)キッチリ報告してくれます。
開発中はこうしておくとよいのでは?
さて問題は、変数のスコープだと思います。
function selectOptEvent(){ $ary_count = count($event_ary); for($k = 0; $k < $ary_count; $k++){ print("<option value='".$event_ary[$k][1]."'>".$event_ary[$k][0]."</option>"); } }
これだと、関数 selectOptEvent() の中では、$event_ary が未定義のままででは?
(関数定義の前というか関数の外で定義しているので)
$event_array を関数外で定義する必要があるなら
現状では引数がないので、
function selectOptEvent($evnary){ $ary_count = count($evnary); for($k = 0; $k < $ary_count; $k++){ print("<option value='".$evnary[$k][1]."'>".$evnary[$k][0]."</option>"); } } のように引数で渡してやる事にして、呼び出し時は selectOptEvent($event_ary); とするとか function selectOptEvent(){ global $evnary; $ary_count = count($evnary); for($k = 0; $k < $ary_count; $k++){ print("<option value='".$evnary[$k][1]."'>".$evnary[$k][0]."</option>"); } } のように global でグローバルスコープの変数であると宣言するかだと思います。
関数外で定義する必要がなければ、
function selectOptEvent(){ $event_ary = array( array("地元","jimoto"), array("農協","nokyo"), array("西地区","nishi_chiku"), array("みなと","minato"), array("助六地区","sukeroku"), array("三四軒屋","sanshikenya") ); $ary_count = count($evnary); for($k = 0; $k < $ary_count; $k++){ print("<option value='".$evnary[$k][1]."'>".$evnary[$k][0]."</option>"); } }
のように $event_ary の定義を関数内に移すとか。
丁寧なご回答ありがとうございます。
パターン別にとてもわかりやすかったです。とても勉強になりました。
丁寧なご回答ありがとうございます。
パターン別にとてもわかりやすかったです。とても勉強になりました。