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(・・・日本語で)が欲しいです。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2009/11/01 17:41:21
  • 終了:2009/11/01 19:27:59

ベストアンサー

id:tezcello No.4

tezcello回答回数460ベストアンサー獲得回数692009/11/01 18:16:53

ポイント100pt
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

id:AKI-NAMI

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

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

2009/11/01 19:25:55

その他の回答(3件)

id:y-kawaz No.1

y-kawaz回答回数1421ベストアンサー獲得回数2262009/11/01 17:59:37

ポイント100pt

$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

id:AKI-NAMI

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

ありがとうございます。

2009/11/01 19:23:40
id:GoldenDawn No.2

GoldenDawn回答回数426ベストアンサー獲得回数812009/11/01 18:00:19

ポイント50pt

$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

id:AKI-NAMI

上の方と同じですね。

ありがとうございます。

2009/11/01 19:23:37
id:amagami No.3

amagami回答回数53ベストアンサー獲得回数02009/11/01 18:00:22

ポイント50pt

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

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

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

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

id:AKI-NAMI

基礎の基礎。

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

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

ありがとうございます。

2009/11/01 19:23:34
id:tezcello No.4

tezcello回答回数460ベストアンサー獲得回数692009/11/01 18:16:53ここでベストアンサー

ポイント100pt
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

id:AKI-NAMI

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

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

2009/11/01 19:25:55
  • id:AKI-NAMI
    どんぴしゃ一番乗りの方に100pt、すごく丁寧にご回答いただいた方にいるか賞と100ptを。
    謝礼ポイントの付け方は迷います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません