リストの配列の一部を別のところから読み込む方法

このQ&Aのポイント
  • リストの配列の一部を別の場所から読み込もうとした際に、NULLになる問題が発生しています。どのように書けば解決できるでしょうか?
  • x2の中身を別の場所から読み込むために、$x_masterを使用しているが、var_dump($list)を実行すると、x2の中がNULLになってしまう。どのように修正すればいいか教えてください。
  • x2の中身を別の場所から読み込む方法を探していますが、$x_masterを使用してもx2がNULLになってしまいます。どのように修正すれば効果的でしょうか?
回答を見る
  • ベストアンサー

リストの配列の一部を、別のところから読み込みたい

リストの配列の一部を、別のところから読み込もうとしたら、NULLになってしまい、うまくいきません。どう書けばよいでしょうか? <現状>  function xList(){   $list = array(    "x1" => array(         1 => "有",         2 => "無",        ),    "x2" => array(         0 => "PHP",         1 => "Ruby",         5 => "Python",        ), となっている、x2の中身を、別から読み込みたいのですが…      $x_master = array(         0 => "PHP",         1 => "Ruby",         5 => "Python",      );  function xList(){   $list = array(    "x1" => array(         1 => "有",         2 => "無",   ),    "x2" => $x_master, これで、var_dump($list);すると、x2の中がNULLになります…

  • re999
  • お礼率61% (476/777)
  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

PHP variable scope http://php.net/manual/en/language.variables.scope.php によれば、関数xList()内で参照されている$x_masterはローカル変数であって、グローバル変数ではないため、 以下のコードは何も出力しない。 http://ideone.com/rBXAm 一方以下のコードは出力する。 http://ideone.com/5fvXv だからこうすると、質問者の言うとおり、NULLになる。 http://ideone.com/18MnT 一方でこうすると、ちゃんと値が入る。 http://ideone.com/66IpM ただ、個人的にあまりグローバル変数って使いたくなくて、出来るだけ、ローカル変数で出来るように出来ないかをいつも考える。 http://ideone.com/hWCjH ではなく、 http://ideone.com/pf6DB って感じでね。

re999
質問者

お礼

詳しいコード&丁寧な解説をいただき、ありがとうございました! てっきり、リストだから、何かそれ用の書き方とかルールがあるのかな? と思って質問してみたのですが、 全然そうではなくて、スコープ範囲の問題だということが分かりました。 また、なるべくグローバル変数ではなくて、 引数を渡して、ローカル変数で、というアドバイスも よく理解できました。 勉強になりましたー。

関連するQ&A

  • [PHP]ループ内の配列取得、表示について

    質問させていただきます。 データをDBから取得しwhileで全てのデータを配列として出力しているとします。 (whileの中で出力し、3つのデータがあるため3回ループされている) 結果 array(1) { [0]=> string(5) "17:10" } array(2) { [0]=> string(5) "17:10" [1]=> string(5) "17:25" } array(3) { [0]=> string(5) "17:10" [1]=> string(5) "17:25" [2]=> string(5) "11:15" } 現在の出力内容は、 var_dump[$hoge[0]] 出力結果 string(5) "17:10" string(5) "17:10" string(5) "17:10" var_dump[$hoge[1]] 出力結果 NULL string(5) "17:25" string(5) "17:25" var_dump[$hoge[2]] 出力結果 NULL NULL string(5) "11:15" という出力になっていますが、最後のarray(3)の部分だけを抜き出したいです。 その場合はどのようにすればよいのでしょうか? -理想の結果- 利用したいのはarray(3)の部分だけ。 var_dump[$hoge[0]] "17:10" var_dump[$hoge[1]] "17:25" var_dump[$hoge[2]] "11:15" 説明不足かもしれませんが、よろしくお願いいたしますm(_ _)m

    • ベストアンサー
    • PHP
  • ExcelのVBAで配列の処理 PHPから移行する新米ですが・・・

    PHPからVBAに移行を考えているのですが、VBAの考え方が難しい?わからず難儀しております。 ExcelのVBAで配列の処理を考えているのですが、以下のPHPと同じ動作をするVBAを書きたいのですが、どうすればよいのでしょうか? <?php // 配列を使って、$aを北海道、青森とする。$bは、単なる受け皿です。 // これをエクセルVBAではどのように記述するのでしょうか? $a = array(); $b = array(); array_push($a, "青森"); array_push($a, "青森"); array_push($b, array_pop($a)); array_unshift($a, "北海道"); array_unshift($a, "北海道"); array_push($b, array_shift($a)); var_dump($a); var_dump($b); exit; ?> また、PHPにはvar_dumpという便利なものがありますが、VBAでは VBEのローカルやウォッチ式で見るというのが普通でしょうか? イミディエイトにvar_dumpのように変数の内容を表示させるコマンドはあるのでしょうか?

  • 2つの配列を比較し、3つ目の配列に入れた後にソートする方法

    javascriptでとある人口の表を作成しようとしています。 そこで、2つの配列を比較して、同じ県名であれば数値を加算して3つ目の配 列に格納し、同じ県名がなかった場合はそのまま3つ目の配列に格納した後、 人口の多い場所から順に並べていくという方法が思いつきません。 (sort関数をどのように使用すればよいのかもわかりません。) var list1[0] = new Array("熊本",100); var list1[1] = new Array("長崎",200); var list1[2] = new Array("佐賀",300); var list1[3] = new Array("宮崎",450); var list2[0] = new Array("熊本",100); var list2[1] = new Array("長崎",200); var list2[2] = new Array("佐賀",300); var list2[3] = new Array("鹿児島",500); という形の2つの配列があった場合 var list3[0] = ["佐賀",600]; var list3[1] = ["鹿児島",500]; var list3[2] = ["宮崎",450]; var list3[3] = ["長崎",400]; var list3[4] = ["熊本",200]; 最終的にはこのような形になるようにしたいです。 どうか教えていただけないでしょうか。 よろしくお願いします。

  • 異なるページへ配列を渡したいのですが、うまくいきません。どうすればよい

    異なるページへ配列を渡したいのですが、うまくいきません。どうすればよいでしょうか? ■現状 APIへアクセスを行い、 simplexml_load_stringを使って、 カテゴリー階層部分を取得して、配列$hitsへ格納しています。 $xml = simplexml_load_string (引数); $hits = $xml->カテゴリー階層部分; これを別ページへ丸まる渡す方法が分かりません。 ネットで検索したところ、 フォームの隠し項目で配列データを渡したい時、という項目があり、 自分がやりたいケースにあてはまるかなと思い試してみたのですが、うまくいきませんでした。 ▽配列データをエンコード、デコードして送受信する - 覚え書き PHP Sample   http://antonsan.net/study/php/php013.php ■試してみた内容 ▽渡す前のページ <form action="**.php" method="get"> <input type="hidden" name="array_enc" value="<?php echo base64_encode(serialize($hits)) ?>"> ▽渡した後のページ print_r(unserialize(base64_decode(@$_GET["array_enc"]))); var_dump($hits); ▽画面でのエラー表示 Warning: unserialize() [function.unserialize]: Node no longer exists in **.php on line 5 SimpleXMLElement Object Warning: print_r() [function.print-r]: Node no longer exists in **.php on line 5 ( ) NULL ■ やりたいことは、別ページへ配列を渡したいだけなのですが、どうすればよいのでしょうか? (特にエンコード、デコード等にこだわりはありません)

    • ベストアンサー
    • PHP
  • PHPとSmartyの関連について

    PHPとSmartyの関連について PHPからSmartyに出力しているのですが中身がNULLになります。 データベースアクセスにはPDOを使用しています。 PHPソース DBアクセス $SQL = "select ITEM_ID from ITEM_TBL limit 0, 3"; $STMT = $GLOBALS["PDO"] -> query($SQL); $ROW = $STMT -> fetchAll(PDO::FETCH_ASSOC); Smartyでアサイン $smarty -> assign("ITEM_LIST", $ROW); Smartyソース <table> {{foreach from=$ITEM_LIST item=LIST}} <tr> <td>{{$LIST.ITEM_ID}}</td> </tr> {{/foreach}} </table> のような感じでページ出力したいのですが、表示をすると中身がNULLでした。 PHP側で var_dump($ROW); を行うと array(3) { [0]=> array(1) { ["ITEM_ID"]=> string(1) "1" } [1]=> array(1) { ["ITEM_ID"]=> string(1) "2" } [2]=> array(1) { ["ITEM_ID"]=> string(1) "3" } } 中身が配列で格納されています。 smarty側で {$ITEM_LIST|@var_dump} を行うと array(3) { [0]=> NULL [1]=> NULL [2]=> NULL } でした。 いろいろとやってみたのですが、わからなくなってしまったので どなたかご教授いただけませんでしょうか。よろしくお願いします。

    • 締切済み
    • PHP
  • 別ファイルに配列を渡して、別ファイルのクラスを実行

    index.phpから別ファイルのclass.phpに配列を渡して、 クラスを実行したいと考えています。 //----------------------------------- //-- index.php --- <?php class hiragana { public $a_ka_sa; function init() { $this->a_ka_sa = array(); } } $j_hiragana = new hiragana(); $val[0] = array('a'=>'あ' , 'i'=>'い' , 'u'=>'う' , 'e'=>'え' , 'o'=>'お'); $val[1] = array('ka'=>'か' , 'ki'=>'き' , 'ku'=>'く' , 'ke'=>'け' , 'ko'=>'こ'); $val[2] = array('sa'=>'さ' , 'si'=>'し' , 'su'=>'す' , 'se'=>'せ' , 'so'=>'そ'); $j_hiragana->a_ka_sa[0] = (object) $val[0]; $j_hiragana->a_ka_sa[1] = (object) $val[1]; $j_hiragana->a_ka_sa[2] = (object) $val[2]; var_dump($j_hiragana); //----------------------------------- このようになっているプログラムを //----------------------------------- //-- index.php --- <?php $val[0] = array('a'=>'あ' , 'i'=>'い' , 'u'=>'う' , 'e'=>'え' , 'o'=>'お'); $val[1] = array('ka'=>'か' , 'ki'=>'き' , 'ku'=>'く' , 'ke'=>'け' , 'ko'=>'こ'); $val[2] = array('sa'=>'さ' , 'si'=>'し' , 'su'=>'す' , 'se'=>'せ' , 'so'=>'そ'); //----------------------------------- 配列の部分だけindex.phpに残して //----------------------------------- //-- class.php --- <?php class hiragana { public $a_ka_sa; function init() { $this->a_ka_sa = array(); } } $j_hiragana = new hiragana(); //-------------- // $val[0] = array('a'=>'あ' , 'i'=>'い' , 'u'=>'う' , 'e'=>'え' , 'o'=>'お'); // $val[1] = array('ka'=>'か' , 'ki'=>'き' , 'ku'=>'く' , 'ke'=>'け' , 'ko'=>'こ'); // $val[2] = array('sa'=>'さ' , 'si'=>'し' , 'su'=>'す' , 'se'=>'せ' , 'so'=>'そ'); //-------------- $j_hiragana->a_ka_sa[0] = (object) $val[0]; $j_hiragana->a_ka_sa[1] = (object) $val[1]; $j_hiragana->a_ka_sa[2] = (object) $val[2]; //----------------------------------- class.phpに移して、 index.phpを開くとclass.phpのクラス?に配列を渡しクラス?を実行する プログラムを作りたいと考えていますが、 うまく配列を渡してクラス?を実行できません。 どのようにすればよいのでしょうか?

    • 締切済み
    • PHP
  • 多次元配列で、foreachを使って、key値を

    多次元配列で、foreachを使って、key値を入れ替えているのですが、 なんで、こうなるか分かりません。  $x = array();  $x[] = array(   "id" => 1,   "name" => "JavaScript",  );  $x[] = array(   "id" => 5,   "name" => "PHP",  );  $z = array();  foreach($x as $key => $value){   $z[$value["id"]] = $value;   }  print_r($z); 配列のKEYをIDに変更しているのですが、 なんで、こうなるのでしょうか? 特に、  $z[$value["id"]] = $value; が分かりません。 例えば、foerachの途中で、var_dumpすると、 1回目だと、 ◆$key 0 ◆$value Array (  [id] => 1  [name] => JavaScript ) ◆$value["id"] 1 まではいいのですが、 ◆$z[$value["id"]] の値が見れません。 ここはどんな処理をやっているのでしょうか?

    • ベストアンサー
    • PHP
  • 空の配列を示す方法

    Flash8を使用して、ActionScript2を書いています。 if文を用いて、「変数my_array(配列)が空の配列でない場合は~」 という条件分岐を書きたいのですが、 空の配列を示す方法がわかりません。 var my_array:Array = new Array(); とした上で、 if (my_array == null) { trace("null"); } else { trace("違う"); } と書いて調べてみたのですが、 nullでもundefinedでも""でも[]でも「違う」と表示されてしまいます。 「空の配列でない場合」という条件を書く方法はあるでしょうか?

    • ベストアンサー
    • Flash
  • javascriptにおける配列のコピー

    javascriptにおける配列のコピーについて質問です。 調べてみると、配列のコピーは破壊・非破壊の区別が あるのまでは理解しました。 非破壊のコピーをしたいので、 Array.prototype.clone = function(){ return Array.apply(null,this) } を用意して、3次元配列をコピーしたのですが、 コピーした配列のデータを変えたりしたら、 元の配列も変わって(破壊的)ました。。 このclone関数は多次元では破壊的になってしまうのですか? ちなみに、aaa[0~10][0~10][0~10]として、 var bbb; bbb = aaa.clone();で行いました。 教えてください、お願いします!

  • セッション変数と配列

    通常の変数であれば、 $var = array($_POST["var1"], $_POST["var2"], $_POST["var3"]); ですが、セッション変数を配列にするにはどうしたら良いのでしょう? (配列から取り出す方法も含め) $var = array($_POST["var1"], $_POST["var2"], $_POST["var3"]); $_SESSION["$var"]; や $_SESSION["$var"] = array($_POST["var1"], $_POST["var2"], $_POST["var3"]); としてみましたが、ダメなんですね。 よろしくお願いいたします。 *PHPバージョンは5です

    • ベストアンサー
    • PHP