関数から呼び出される別の関数でも同じ配列を使う方法

このQ&Aのポイント
  • 関数から呼び出される別の関数でも同じ配列を使う方法を知りたいです。
  • 配列をグローバル変数化して、他の関数でも使用する方法を試していますがうまくいきません。
  • どのように書けば関数から呼び出される別の関数でも同じ配列を使うことができるのか教えてください。
回答を見る
  • ベストアンサー

関数から呼び出される別の関数でも同じ配列を使うには

配列をグローバル変数化して、使おうとしています。 <?php $strMoji=array("a","b","c","d","e","f","g","h","i"); $result=fun_disp(2); function fun_disp($i){ global $strMoji; echo $strMoji[$i]; return true; } ?> とすれば、$strMoji[$i];には、c が入っていると表示されました。 ところが、 <?php $result=fun_example(8); function fun_example($j){ echo $j; $strMoji=array("a","b","c","d","e","f","g","h","i"); $result=fun_disp(2); } function fun_disp($i){ global $strMoji; echo $strMoji[$i]; return true; } ?> とすると、$strMoji[$i]; が表示されなくなりました。 やりたいことは、「ある関数内で使っている配列を、その中から呼び出される 別の関数でも使いたい」ということです。 しかし、方法が分からないでいます。どのように書けばいいのでしょうか? ※関数に、2を投げたり8を投げたりしていますが、この値は適当です。

  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

グローバルをつかうならこう <?php $result=fun_example(8); function fun_example($j){ echo $j; global $strMoji; $strMoji=array("a","b","c","d","e","f","g","h","i"); $result=fun_disp(2); } function fun_disp($i){ global $strMoji; echo $strMoji[$i]; return true; } ?> ただしグローバルは最後の手段、引数で渡すのが普通

dv8hjkwf
質問者

お礼

ありがとうございました。両方の関数内に記述するわけですね。 引数を渡す方法も調べておきます。

その他の回答 (1)

回答No.2

質問者と#1以外のやり方。 クラスを用いる。 でその両方の関数をクラスに入れてメソッドとして変数をグローバル変数ではなくて プロパティとしてprivateとして定義する。

dv8hjkwf
質問者

お礼

ありがとうございます。こういうときは、クラスかなあ? とも思いましたが、応用性はゼロだったので、作るまでもないかなあとしました。

関連するQ&A

  • 多次元配列を、1次元の配列にする関数を書いてください。

    以下のように、多次元配列の配列をペチャンコにする関数(array_flatten)ってどうかきますか? <?php $arr[0] = 'a'; $arr[1][0] = 'b'; $arr[1][1][0] = 'c'; $arr[1][1][1][0] = 'd'; $arr[1][1][1][1][0] = 'e'; $arr[1][1][1][2] = 'f'; $arr[1][1][2] = 'g'; $arr[1][2] = 'h'; $arr[2] = 'i'; function array_flatten($arg){   処理; } $new_arr = array_flatten($arr); print_r($new_arr); ?> ↓ Array (   [0] => a   [1] => b   [2] => c   [3] => d   [4] => e   [5] => f   [6] => g   [7] => h   [8] => i ) ※関数のなかで、ペチャンコの配列を格納するための新しい配列を宣言すると、 同関数を再帰的に呼び出したら、その配列が初期化されますよね?

    • ベストアンサー
    • PHP
  • 関数戻り値が連想配列の場合

    こんにちわ。 PHP5について質問です。 あるユーザ関数の戻り値が連想配列である場合、 ユーザ関数の実行~戻値の特定のキーの値を取得 までを1行で取得する方法があれば教えてください。 例) function hoge() {  return array("fuga" => "1", "moge" => "2"); } ここで"moge"の値を一発で参照したいと考えています。 通常では、 $result = hoge(); print $result["moge"]; のようにしていますが、これを一行で実現できる方法はありますでしょうか。

    • ベストアンサー
    • PHP
  • 関数の引数に配列を初期化なしで。

    関数の引数に配列を初期化して渡しているプログラムを目にします。 関数の引数に配列を初期化なしで渡す場合とどう違うのでしょうか? 例 <?php echo tesutoFunc(array('reservation' => 'a','user' => 'b')); function tesutoFunc($arrays=array()){ //ここをなぜtesutoFunc($arrays)と書かないのか? print_r($arrays); } ?>

    • ベストアンサー
    • PHP
  • 配列を関数に渡したいのですが…

    次のように配列を関数に渡したいのですが、うまく出来ません。どのようにしたら良いのでしょうか? 渡したい配列の個数は、偶数個ですが、未知の個数です。 $A_LINK = A_LINK("TEST_NAME", "TEST_VAL"); function A_LINK($array) { while (count($array) > 0) { $name = array_shift($array); $value = array_shift($array); $name = urlencode($name); $value = urlencode($value); $msg .= "$name=$value"; } return $msg; }

    • ベストアンサー
    • PHP
  • ajaxで取得した配列の取り扱い

    こんにちは。 jqueryとphpを利用して、ajaxの練習をしているのですが、 受け取った配列の扱いではまってしまっています。 javascript.js $.ajax({ type : "post", url : "http://localhost/*****.php", data : post_data, datatype : "json", success :function(data,datatype){return_data(data);}, error : error_ajax(), }); php側では、受け取ったデータに応じて多次元配列を作り、jsonに変換してechoしています。 そして以下が成功時に実行する関数です。 function return_data(obj){ //配列topic以下を処理する関数 disp_topic(obj['topic']); //配列topic以下を処理する関数 dixp_tags(obj['tags']); } すると、obj['topic']が見つからないというエラーが出ます。 firebugsで見てみると、function return_dataの引数objには、jqueryがjsonからjavascriptのオブジェクトへ変換処理した配列が渡っているようです。。 引数objの値は以下のようになっていいます。 { "topic":  [{"tagno":"27","tags":"***"}], "tags":  [{"tagno":"27","tags":"****","count":"6"},   {"tagno":"29","tags":"****","count":"4"}, {"tagno":"1","tags":"****","count":"3"}, {"tagno":"9","tags":"****","count":"1"}] } 変数obj内のtopicに応じた配列と、tagsに応じた配列をそれぞれ取り出し、それぞれの関数で処理したいのですが、これを取り出すのにはどのようにしたらよいのでしょうか。 var array = obj['topic']; などと散々やってみたのですが、2日間解決できず・・・。 よろしくお願い申し上げます。

  • 多次元配列をエンコードする関数を作るには?

    多次元配列でも文字コードのエンコードができる関数を 作ろうとしていますが、エラーで躓いています。 自分自身の関数を再帰で呼び出しているので、array_map関数上? 引数が1つしか持てないので、$valueを array($ary, "SJIS", "EUC-JP")として渡しています。 これを実行すると、以下のエラーになります。 何かよい方法はありますか? PHP Notice: Undefined offset: 0 in C:\test.php on line 10 function mb_convert_encoding_deep($value) { //var_dump($value); if( is_array($value) ){ if( is_array($value[0]) ){ array_map(__FUNCTION__, $value); }else{ $value[0] = mb_convert($value[0], $value[1], $value[2]); } }else{ die("ここは通過しないと思いますが自信なし"); } return $value; } $ary = mb_convert_encoding_deep( array($ary, "SJIS", "EUC-JP") ); array_mapの用法でも間違っているのでしょうか?

    • ベストアンサー
    • PHP
  • 関数とarguments配列

    ●質問の主旨 下記サイト、CodeStudyによる JavaScriptの関数とarguments配列の 使い方に関する問題に対する 答えとなるコードの記述が分かりません。 どなたかアドバイスをお願いします。 CodeStudy 関数その2 3.arguments その3 http://jeek.jp/study/section18/3 ●問題文 関数checkが定義されています。 check内のif文により、引数が3つ以外の際は、 outputで"引数が3つではありません。"と出力させましょう。 function check(x, y, z) { if() { output("引数が3つではありません。"); } } check(1, 2, 3, 4); ●自分で作った途中経過 resultやreturnの使い方がよく分かりません。 function check(x, y, z) {  var result = 0; if(arguments.length !== 3) { output("引数が3つではありません。"); } return result; } check(1, 2, 3, 4); output(check); ●コードの条件(ヒント) argumentsは、引数を格納する配列で、 argumentsを使うと引数をいくつでもとることが出来ます。 また、argumentsは配列なので、 .lengthを使うと長さが求められます。

  • 割り切れなくなるまで分割して配列に入れたい

    <?php make(7); function make($n) { $arr = array($n); $arr_new = division_arr($arr); print_r($arr_new); } function division_arr($arr) { for ($i = 0; $i < count($arr); $i++) { $arr_new[$i] = division($arr[$i]); if ($arr_new[$i][0] > 0) { return division_arr($arr_new[$i]); } else { } } return $arr_new; } function division($n) { $a = $b = floor($n / 2); if ($n % 2 != 0) { $b+=1; } return array($a, $b); } /* array( [3,4], [[1,2],[2,2]], [[0,1],[1,1],[1,1],[1,1]] ); 再帰的に配列を分割していき、最終的にこのような出力にしたいです。 */ ?> 教えて下さい。よろしくお願いいたします。m(_ _)m

    • ベストアンサー
    • PHP
  • 4つの異なる二次配列を関数で表示

    二次配列と関数の問題です。 [日本語訳]displayArray7を呼ぶ関数を書きなさい。その関数は二次配列を一つの引数として受け取り、その内容を画面に表示すべきである。その関数は下のいずれの配列でも動作するようにしなさい。プログラムを書いてその関数を評価しなさい。 4つの配列とも一次の項(?)の数が違うじゃないですか。しかも関数を呼ぶときは配列[5][7]などはいらないですよね? (displayArray7(hours);だけ) だから、各配列の一次の項がどんな数字を持っているのかを関数displayArray7に送ることが出来ず、どのように表示してよいのか分かりません(今は一応最大値50で表示しています)。どのようにすればよいのでしょうか? 教えてください。お願いします。 #include <iostream> using namespace std; void initialize(int array[][7]); void displayArray7(int array[][7]); int main() { int hours[5][7]; int stamps[8][7]; int autos[12][7]; int cats[50][7]; initialize(hours); displayArray7(hours); initialize(stamps); displayArray7(stamps); initialize(autos); displayArray7(autos); initialize(cats); displayArray7(cats); return 0; } void initialize(int array[50][7]) { int i, j; for(i=0; i<50; i++) for(j=0; j<7; j++) array[i][j] = 0; } void displayArray7(int array[][7]) { int i, j; cout << "\t1\t2\t3\t4\t5\t6\t7" << endl << endl; for(i=0; i<50; i++){ cout << i+1 << ":"; for(j=0; j<7; j++){ cout << "\t" << array[i][j]; } cout << endl << endl; } }

  • 関数内での繰り返し処理の結果を配列で受け取りたい

    関数内でfor文で繰り返し処理を行い、 結果を配列として返すような関数を書きたいと思っています。 function hoge(){ var a = [1,2,3,4]; for (var i=0; i < a.length; i++){ a1 = "a" + i; var arr = new Array(); arr.push(a1); } return arr; } しかし、以下のように 関数hogeの結果を変数bで受け取ってみると、 配列の最後のデータしか表示されません。 var b = hoge(); alert(b); //a3のみが表示される a0, a1, a2, a3と表示されるようにするには、 どうしたらよいでしょうか。

専門家に質問してみよう