質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

1740閲覧

配列を変数で指定して値を取得

ssmxgo

総合スコア178

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/06/01 10:03

配列を変数で指定して値を取得するやり方を教えて下さい。

php

1$array['abc']['def']['ghi']['jkl']='TEST'; 2 3//やり方のイメージ1 4$get_1=['abc','def','ghi','jkl']; 5echo $array[$get_1]; //=> TEST 6 7//やり方のイメージ2 8$get_2=['abc'=>['def'=>['ghi'=>'jkl']]]; 9echo $array[$get_2]; //=> TEST

もしかしたら、凄い基礎的なことかもしれないので恐れ恐れお聞きします(;´Д`)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

使うことは無いと思いますが、こういう方法なら可能です。

PHP

1$array['abc']['def']['ghi']['jkl']='TEST'; 2$get_1="['abc']['def']['ghi']['jkl']"; 3eval("echo \$array".$get_1.";"); 4//TEST 5 6eval("\$val = \$array".$get_1.";"); 7echo $val; 8//TEST

php 関数リファレンス

警告

eval() は非常に危険な言語構造です。 というのも、任意の PHP コードを実行できてしまうからです。 これを使うことはおすすめしません。 いろいろ検討した結果どうしても使わざるを得なくなった場合は、細心の注意を払って使いましょう。 ユーザーから受け取ったデータをそのまま渡してはいけません。 渡す前に、適切な検証が必要です。

投稿2016/06/01 14:52

編集2016/06/01 14:59
hirohiro

総合スコア2068

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ssmxgo

2016/06/02 02:20

おおおおお、この手がありましたか!! 存在は知ってましたが発想が湧きませんでした。 が、セキュリティ的な問題が多そうな気がしますが、これが外からのユーザーの干渉を受けなかったとしても問題あるのでしょうか?
hirohiro

2016/06/02 03:24 編集

十分考慮して使えば問題ないと思います。 ただ殆ど使わない手法で三項演算子のように大抵「むむ!?」って混乱しそうですし、またそうでなくても可読性が落ちると思います。 ちょこっと使うだけならいいんですが、余り乱用するとメンテナンス性も低下すると思います。
ssmxgo

2016/06/02 03:53

ありがとうございます。 皆さん感謝ですが、決定的な解決法になったhirohiroさんにベストアンサーを送りたいと思います。
guest

0

tanatさんのおっしゃるように、それ用の関数つくるのかなあ。
手抜きするならこんな感じ?

PHP

1$array['abc']['def']['ghi']['jkl']='TEST'; 2$get_1=['abc','def','ghi','jkl']; 3 4echo getArrayValueByArray($array,$get_1); 5 6function getArrayValueByArray($data_array,$key_array){ 7 list($k1,$k2,$k3,$k4) = $key_array; 8 return $data_array[$k1][$k2][$k3][$k4]; 9}

投稿2016/06/01 11:12

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ssmxgo

2016/06/01 11:18

ありがとうございます。着眼点というのは凄いとか経験って凄いと思いましたw(list関数なんて使ったことなかったです) 説明不足でしたが、$get_1の配列は不確定で、4つと固定されているわけではありません。 すみませんorz
guest

0

出来れば面白いと思って調べてみましたが、
PHPマニュアル 配列
PHPで配列の添え字に数値と文字列以外が使えるという記述は見当たりませんでした。

なので、やろうと思うなら自分で関数なりメソッドなりを作って実装しないと出来ないと思います(もしかしたらそういう関数があるかも?)

多分こんな感じ(動かしてもいないので雰囲気だけ)

PHP

1$array['abc']['def']['ghi']['jkl']='TEST'; 2$get_1=['abc','def','ghi','jkl']; 3 4echo getArrayValueByArray($array,$get_1); 5 6function getArrayValueByArray($data_array,$key_array){ 7 $current_val = $data_array; 8 foreach($key_array as $key => $val){ 9 if(isset($current_val[$val])){ 10 $current_val = $current_val[$val]; 11 }else{ 12 //unsetとnullは違うので、nullを返すのは厳密には微妙 13 return null; 14 } 15 } 16 17 return $current_val; 18} 19 20

ただ、この実装が必要なケースだと、多次元連想配列で頑張るよりは、添え字そのものを工夫して1次元にするとか、オブジェクトにして内部操作を隠蔽するとかそういった方向で設計した方がいいケースの方が多いんじゃないかなとも思います。

投稿2016/06/01 10:56

tanat

総合スコア18709

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ssmxgo

2016/06/01 11:12

やはり関数しかなさそうですか…(^_^;) もともとXML構造を配列化して、大量のデータを一次配列にするための手法を考えていました。変換表?をもとに一次配列のKEYに対してVALをセットするのに質問出せて頂きました。 ただ、最後までコードを書いてくださり、理解が深まりました。ありがとうございました。
tanat

2016/06/01 11:22

大量のデータを一次元配列にするだけなら、 そこまでのキーを適当な文字列で連結しちゃえばいい気がしますね。 $array['abc']['def']['ghi']['jkl']='TEST'; なら $new_array["'abc'-'def'-'ghi'-'jkl'"] みたいに変換する。 *実際には-がXMLに存在してたら先にエスケープするなど工夫する必要があるとは思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問