人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

php についての質問です。
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(・・・日本語で)が欲しいです。

●質問者: AKI-NAMI
●カテゴリ:ウェブ制作
✍キーワード:HTML PHP print URL タイプミス
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● y-kawaz
●100ポイント

$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>");
 }
}
?>

http://php.net/manual/ja/language.variables.scope.php

◎質問者からの返答

独学で作っていった中でこんなスコープの問題にはじめて当たりました。

ありがとうございます。


2 ● GoldenDawn
●50ポイント

$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.php.net/manual/ja/language.variables.scope.php

◎質問者からの返答

上の方と同じですね。

ありがとうございます。


3 ● amagami
●50ポイント

http://www.komonet.ne.jp/~php/chap9.htm

変数のスコープの問題です。

$event_aryはfunction selectOptEventの中に届いていません。

仕様と言えばもちろん仕様ですが、PHPに限らずまず確認しておくべき基礎の基礎かと思います。

◎質問者からの返答

基礎の基礎。

こういうものが独学というか、素人がいきなり作っていくなかでは躓かないとなかなかわかりません。

こんなご指摘で、マニュアルを読み始めるきっかけになります。(部分だけですが・・・)

ありがとうございます。


4 ● tezcello
●100ポイント ベストアンサー
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 の定義を関数内に移すとか。

http://q.hatena.ne.jp/1257064879

◎質問者からの返答

丁寧なご回答ありがとうございます。

パターン別にとてもわかりやすかったです。とても勉強になりました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ