PHPで参照渡しから配列変数名を取得する方法

このQ&Aのポイント
  • PHPで参照渡しから配列変数名を取得する方法について説明します。
  • 質問者は現在PHPを勉強中で、配列変数名を個別に出力したいとのことです。
  • 質問のコード例では、character関数内で変数名を取得する方法についての解決策が提案されています。
回答を見る
  • ベストアンサー

参照渡しからの配列変数名取得。

現在PHPを勉強中で、 以下のようなスクリプトを書いていて <?php function character(&$target) { $arrayName = $target."_name"; echo ($arrayName); } $animals[] = 'いぬ'; $animals[] = 'さる'; $animals[] = 'きじ'; character($animals); echo ("<br />"); $fish[] = 'まぐろ'; $fish[] = 'ひらめ'; $fish[] = 'かつお'; $fish[] = 'あじ'; character($fish); ?> このようにすると$arrayNameの出力が2つともArray_nameとなってしまうので、 この部分を各配列の変数名($animals_name、$fish_name)のように個別に 出力できるようにしたいのですが、どのように書けば出来るのでしょうか? 宜しくお願いいたします。

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

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

  • ベストアンサー
  • shiren2
  • ベストアンサー率47% (139/295)
回答No.1

参照渡しは変数名が渡されるわけではないので、そのままでは無理です。 構造的に最も良いのは変数名を渡すことです。 function character($target, $arrayName){ echo($arrayName . "_name"); } character($animals, 'animals'); あまり良くはないですが、こういった書き方も一応は出来ます。 function character($target) { $arrayName = $target."_name"; echo ($arrayName); global $$target; echo "<ul>"; foreach($$target as $v) echo "<li>$v</li>"; echo "</ul>"; } character('animals');

tendon_m
質問者

お礼

回答いただきありがとうございます<(_ _)> 参照渡しは配列の変数名も渡しているわけではないのですね、、、。 下の書き方だと出来るみたいですが、確かにちょっと強引になってしまうようですね。 上記のように引数を追加して変数名を入れたほうが良さそうなのでそちらのほうで 作ってみたいと思います。 ありがとうございました。

その他の回答 (1)

  • duron
  • ベストアンサー率77% (73/94)
回答No.2

以前、デバッグ用に「変数名=値」を出力できる関数が 作れないか調べてたことがあります。 その時海外のフォーラムで見つけたものなのですが バックトレースを利用して力技で実現したものがありました。 <?php function character($target) { $trace = debug_backtrace(); // バックトレースレースを生成 $vLine = file($trace[0]["file"]); // 呼び出し元ファイルの内容を配列に取得 $fLine = $vLine[$trace[0]['line'] - 1]; // 呼び出し元の行の内容を取得 preg_match('/\$(\w+)/', $fLine, $match); // 変数名を正規表現で取得 echo ($match[0]."_name"); } $animals[] = 'いぬ'; $animals[] = 'さる'; $animals[] = 'きじ'; character($animals); echo ("<br />"); $fish[] = 'まぐろ'; $fish[] = 'ひらめ'; $fish[] = 'かつお'; $fish[] = 'あじ'; character($fish); ?> 正攻法ではないですが、発想の転換で実現できるというところに ものすごく感心してしまいました。 このような発想ができる人間に自分もなりたいです。

tendon_m
質問者

お礼

なるほど~、このようなやり方もあるのですね。 バックトレースを利用してこのように出来るのは知らなかったです。 ありがとうございました。

関連するQ&A

  • 多次元配列?配列のキー?変数の型?

    PHP勉強中のものです。 予定通りの動作にならんく四苦八苦しています。 どのように修正すれば予定通りになるのか考え方のアドバイスなどお願いします。 処理したいこと 変数$xxxの先頭の文字と最後の文字をsubstr()で取り出し$aaaと$bbbに別けそれぞれ代入しキーとして多次元配列に代入した配列要素を指定してechoで出力したい 試してみたこと $aaa1と$bbb1に直接整数を代入してみたところ、echoで出力された キーになる変数を整数型として変数に代入してみたが希望通りの動作にならなかった。 なにかアドバイス頂けると助かります。 $array = array( "0" =>array("あいうえお","かきくけこ"), "1" =>array("さしすせそ") ); $xxx = "0-1"; $aaa = substr($xxx,0,1); $bbb = substr($xxx,2); $aaa = (int)$aaa; $bbb = (int)$bbb; echo $array[$aaa][$bbb]; //出力されない $aaa1 = 0; $bbb1 = 1; echo $array[$aaa1][$bbb1]; //出力された $aaa = (int)$aaa; $bbb = (int)$bbb; echo $array[$aaa][$bbb]; //出力されない

    • ベストアンサー
    • PHP
  • フォームを使った配列変数の受け渡し

    PHP初心者です、よろしくお願いします。 フォームからPHPで配列変数を受け渡すことを考えています。 一次元配列はうまく渡せましたので、これを二次元にしましたところ、 うまく渡せません。基本的なPHPの文法がわかってないので、つまづい ています。多分、配列変数の記述方法がおかしいのだと思うのですが・・。 ご教授よろしくお願いします。 <html> <body> <form method = "POST" action ="test2.php" > <?php //データ渡し側 for ($i = 0 ;$i < 2 ;$i ++){ for ($j=0 ;$j <2;$j ++ ){ echo ("<input type ='text' name = 'data[$i][$j]' size ='10'>\n"); echo ("<br>\n"); } echo ("</tr>\n"); } ?> <input type="submit" name ="sbmit" value="data_input" > </form> </body> </html> <?php //データ受け側 for ($i = 0 ;$i < 2 ;$i ++){ for ($j=0 ;$j < 2;$j ++ ){ $tmp_data[$i][$j] = $_POST["data"][$i][$j]; echo ("$tmp_data[$i][$j] <br>\n"); } } ?> <html> <body> <form method = "POST" action ="test2.php" > <?php for ($i = 0 ;$i < 2 ;$i ++){ for ($j=0 ;$j <2;$j ++ ){ echo ("<input type ='text' name = 'data[$i][$j]' size ='10' value='$tmp_data[$i][$j]'>\n"); echo ("<br>\n"); } } ?> </table> <input type="submit" name ="sbmit" value="in" > </form> </body> </html> 実行結果は、 Array[0] Array[1] Array[0] Array[1] と表示されて、実際の入力した値が反映されません。

    • ベストアンサー
    • PHP
  • 配列名や変数の一部として変数(文字列)を使う方法?

    PHPを勉強し始めたばかりの者です。以下のような状態で、 配列の要素(例「へべれけ」)を出力したいのですが、 どうもうまく行きません。どうかアドバイスをいただけませんでしょうか? <?php $arDrunk = array("ほろ酔い","へべれけ","記憶なし"); $status = array("Sleepy","Drunk","Hungry"); $ref = $status[1]; //Drunk $hoge = "ar$ref"; //arDrunkと入れているつもりです。 // ↓print_rではちゃんと全ての要素が閲覧できるのに echo "<pre>"; print_r($$hoge); echo "</pre>"; // ↓では何も出力されません。 echo $$hoge[1]; // $arrayDrunk[1]、つまり「へべれけ」を出したい。 echo '$$hoge[$i]という形では使えないのでしょうか?' ?> もしかして$$hogeを処理するための、JavaScriptでの evalのようなものがあるのでしょうか?

    • ベストアンサー
    • PHP
  • 添え字が全て文字列のPHPの多次元配列をSmartyでループ表示したい。

    PHPで作成した多次元配列をSmartyでループして表示する方法について。(添え字が全て文字列の場合で、ループ回数を固定したい。) こんにちわ。 以下のような配列があるとします。 $abcde = array("sakana" => array("aaa" => "あじ","bbb" => "ひらめ"),"oyasai" => array("ggg" => "ふき","hhh" => "トマト"),"niku" => array("eee" => "ぶた","ooo" => "鳥")); echo "<pre>"; print_r($abcde); echo "</pre>"; この配列をSmartyに渡し、以下の条件でループして表示したいのですが、いい方法はありますでしょうか。 ・ループ回数は二回 ・一番最初の添え字(sakana、oyasai、niku)の値を使わずに表示したい。(自動的に上から順番に取り出してほしい) foreachだと全ての値が表示されてしまい、sectionだとうまく表示されませんでした。 ↓こんな感じで表示したいです。(ループ二回なので肉は表示せず) 魚 :あじ、ひらめ 野菜:ふき、トマト よろしくお願いします。

    • ベストアンサー
    • PHP
  • 多次元配列から作った表の重複行をまとめたい

    データベースからある期限(14年3月21日から3月30日)で取得した下記の多次元配列から日付に該当するデータがあればセルに値を入れて表を作ったのですが、 <?php $cal=array( array("type" => 19, "name" => "山田", "hour" => 5, "day" => 2014-03-21), array("type" => 19, "name" => "山田", "hour" => 8, "day" => 2014-03-24), array("type" => 19, "name" => "山田", "hour" => 8, "day" => 2014-03-26), array("type" => 19, "name" => "田中", "hour" => 8, "day" => 2014-03-23), array("type" => 19, "name" => "田中", "hour" => 8, "day" => 2014-03-26), array("type" => 19, "name" => "田中", "hour" => 3, "day" => 2014-03-28), array("type" => 20, "name" => "大田", "hour" => 3, "day" => 2014-03-21), array("type" => 20, "name" => "大田", "hour" => 5, "day" => 2014-03-27), array("type" => 20, "name" => "田中", "hour" => 3, "day" => 2014-03-24), array("type" => 20, "name" => "田中", "hour" => 4, "day" => 2014-03-27), array("type" => 0, "name" => "高橋", "hour" => 1, "day" => 2014-03-27), ); ?> <?php foreach ( $cal as $val ) : ?> <tr> <td><?php echo $val['type']; ?></td> <td><?php echo $val['name']; ?></td> <?php for ( $i = 21; $i <= 30; $i ++ ) : ?> <td> <?php if ( $day == $i ) { echo $val['hour']; } ?> </td> <?php endfor; ?> </tr> <?php endforeach; ?> 同じIDと名前の行が複数あり、同じIDと名前の行をひとつにしたいのです(画像参照)がわからず質問させていただきました。よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 多次元配列の画面出力

    PHP 5.1.6で、 <?php $ary[0][0]="ABC"; $ary[0][1]="DEF"; echo "$ary[0][0],$ary[0][1]"; ?> だと Array[0],Array[1] と出力されます。$ary[0]までで変数の認識を終わらせちゃってるようです。 <?php $ary[0][0]="ABC"; $ary[0][1]="DEF"; $a=$ary[0][0]; $b=$ary[0][1]; echo "$a,$b"; ?> とすると ABC,DEF と出力されます。 上のような記載方法でうまく出力する方法はないものでしょうか? 実用で困ってる訳でも変数をケチっている訳でもないんですが、些細な可読性の面で。

    • ベストアンサー
    • PHP
  • 配列のデータを受け取る、のバグ

    PHPスーパーサンプル第2版の2-3/rcvarray.phpからの抜粋です。 <html> <head> <title>配列のデータを受け取る</title> </head> <body> <?php <?php $array = array("menu"=>"カレー", "price"=>"380", "date"=>"2005/01/01"); echo "配列の内容(エンコードした場合)"; print_r(unserialize(base64_decode($_POST["ar_enc"]))); echo "<p>配列の内容(そのまま渡すと失敗)"; print_r($_POST["ar"]); ?> <form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>"> <input type="submit" value="送信" name="sub1"> <input type="hidden" name="ar" value="<?php echo $array ?>"> <input type="hidden" name="ar_enc" value="<?php echo base64_encode(serialize($array)) ?>"> </form> </body> </html> を実行すると、 配列の内容(エンコードした場合): Notice: Undefined index: ar_enc in /UNIONFS/opt/lampp/htdocs/samples/chapter2/2-3/rcvarray.php on line 14 配列の内容(そのまま渡すと失敗): Notice: Undefined index: ar in /UNIONFS/opt/lampp/htdocs/samples/chapter2/2-3/rcvarray.php on line 16 というエラーが出るんですが、どうやって直せばいいのですか? 正しくは、上には配列の内容が表示され、下にはarrayとだけ表示されるようです。 $arrayの直後に     $ar_enc = "";     $ar = ""; と挿入してみましたがダメでした。 @でエラーを抑制するのはなしでお願いします。

    • ベストアンサー
    • PHP
  • タグに変数を埋め込んでも値が反映されません。

    こんにちわ。 最近PHPを始めた者です。 echo を使ってブラウザに出力する時に、 echo "<a href=test.php?     page=$page>$name</a>"; と記述しましたら、 ブラウザで 「$name」はリンクとして表示されますが、 リンクアドレスは、「test.php?page=」となり $pageの値が入りません。 解決方法を教えて欲しいです・・・。 初歩的なことかもしれませんが宜しくお願いします。

    • ベストアンサー
    • PHP
  • 2つの変数(文字)を組み合わせて1つの変数として認識させる方法?

    PHPの初心者チュートリアルサイトやphp manualなども見てるのですが あまりに基本的過ぎるのか、どうしてもわからないので教えてください。 $myarray1 = array("a","b","c"); $myarray2 = array("d","e","f"); $myarray3 = array("x","y","z"); という配列があるとして、 これをforループで使いたいと考えました。 例えば無理やり書くと下記のようなイメージなのですが やはりこのようなあてずっぽうではうまく行かず・・・。 for( $i = 1; $i<= 3; $i++ ){ echo {$myarray.$i}[0] . "<br/>"; } 「$myarray.$i」を$myarray1~3と認識させてa,d,xの3つを出力することはできますか?

    • 締切済み
    • PHP
  • 配列として受け取った値を配列でない値に戻すには?

    お世話になります。 server_management.php(フォーム)から、server_management_remove_all.php(受け取り側ファイル)に配列としてデータを渡し、データを一括で更新するフォームを作成したのですが、server_management_remove_all.phpにおいて、header("Location: https://www.hogehoge/hogegege/server_management.php?id=".$id);というように戻り先のURLを指定し指定したURLに戻りたいのですが、変数$idに入れたい数字 (category_id)が配列として渡されてきているためかうまく変数$idに入れる事が出来ません。 【server_management.php】のソース ------------------------------------------------------------------ echo "<form action = \"server_management_remove_all.php\" method = \"post\">"; while($row = mysql_fetch_array($result)){ echo "<input type = \"hidden\" name = \"category_id[$row[item_id]]\" value =\""; echo $row["category_id"]; echo "\">"; 中略 } echo "<p>利幅1:<input type = \"text\" name = \"all\" value =\""; echo $row["all"]; echo "\" size = \"40\"></p>"; echo "<p>利幅2:<input type = \"text\" name = \"all2\" value =\""; echo $row["all2"]; echo "\" size = \"40\"></p>"; echo "<p>利幅3:<input type = \"text\" name = \"all3\" value =\""; echo $row["all3"]; echo "\" size = \"40\"></p>"; echo "<input type=\"submit\" value=\"一斉更新\">"; echo "</form>"; ?> ------------------------------------------------------------------ 【server_management_remove_all.php】のソース ------------------------------------------------------------------ $id=$_POST[category_id][$item_id]; header("Location:https://www.hogehoge/hogegege/server_management.php?id=".$id); if(isset($_POST['server_name'])){ foreach($_POST['server_name'] as $item_id=>$server_name) { $sql="update hametome_item set"; $sql.=" profit1='".$_REQUEST[all]."',"; $sql.=" profit2='".$_REQUEST[all2]."',"; $sql.=" profit3='".$_REQUEST[all3]."',"; 中略 $sql.=" category_id='".$_POST[category_id][$item_id]."'"; $sql.=" where item_id = ".$item_id; mysql_query($sql); } } ------------------------------------------------------------------ データを入力する際には、https://www.hogehoge/hogegege/server_management.php?id=15といったようなURL(戻りたいURL)から入力する形になっていて、同一のカテゴリーであれば、category_idは同じ数字です。 このような場合、どのようにすればよいのでしょうか?どうかご教授のほどよろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう