2017-10-16 28 views
3

PHPとして格納された値を使用してフォームで配列のキーを「事前作成」できるようにするために便利な機能を持っていますPHP配列のキー

<input type="text" name="settings[store][this][here]" /> 

さて、データベースに私は「場所」のを保存しています

echo $result[settings][database-field]; 

た:このような

[store][this][here] 

私は、配列の呼び出しで、この値をリコールしたい、このフィールドの値を使用して、特定の値、その後になる:

echo $result[settings][store][this][here]; 

どのように私はこれを行うには、私の呼び出しを構築することができますか?

私は次のことを試みたが、無駄にしている:

echo $result[settings][$row[database-field]]; 
echo $result[settings][${$row[database-field]}] 

答えて

0

https://eval.in/880737

またはユーザー入力がない場合、あなたはeval

eval('$final = $result[settings]'.$vars.';'); 
echo $final; 

ライブデモで1つのライナーコードを使用することができます:https://eval.in/880753あなたはこの

<?php 
    $result = [ 
     "settings"=>[ 
      "store"=>[ 
       "this"=>[ 
        "here"=>"Got it!!" 
       ] 
      ] 
     ] 
    ]; 
    $vars = "[store][this][here]"; 

    function getVal($val,$vars){ 
     $vars = explode("][",rtrim(ltrim($vars,"["),"]")); 
     $new = array(); 
     foreach ($vars as $key => $var) { 
      $val = $val[$var]; 
     } 
     return $val; 
    } 

    $final = getVal($result["settings"],$vars); 
    echo $final; 
?> 

ライブデモのようにそれを解析する必要があるのいずれか

私はこのように直接ご使用になりましたので、$result[settings][store][this][here];も一部の通知を受けて動作します。しかし、あなたが連結していることによって作成しているので、中括弧は配列として扱われません。

ライブデモ:https://eval.in/880743

0

データベースからブラケットを取り外し、それらを区切るために;を使用しています。

あなたは$array = explode(';', $databasestring);

は、このような結果をエコー配列に格納しexplodeを使用すると、このsettings;store;this;value

のようにデータベースに格納します。

echo $result[$array[0]][$array[1]][$array[2]][$array[3]]; 
+0

これは実際には悪い考えではありません。しかし、手動トラバースに頼らずに、対応する(最後の)配列キーを1回の呼び出しで呼びたいと思います。それを達成するために使用できる機能はありませんか? echo $ result [$ array];のようなものです。 ? – Taapo

0

私はカップルの考えることができますこれを行う方法のしかし、これは悪いデザインのように思えるので、これを考えてみてください!これはから来て、特別ので、

<?php 
$result = []; 
$result["store"]["this"]["here"] = "test"; 
$key = "[store][this][here]"; 

// some housekeeping 
$keyArr = explode("][", $key); 
$keyArr[0] = trim($keyArr[0], "["); 
$keyArr[count($keyArr) - 1] = trim($keyArr[count($keyArr) - 1], "]"); 
$res = $result; 
foreach ($keyArr as $key) { 
    if (isset($res[$key])) { // make sure the key exists 
     $res = $res[$key]; 
    } 
} 
var_dump($res); // test 

Demo

もう一つの方法が、ひどく不安定な

まず、あなたは、アレイ内の実際のキーとしてそれをアクセスするために、それ自体で各要素を取得することができますユーザーの入力は、eval()を使用します。それはあなたがPHPコードとして渡す引数を実行します(どのように危険な参照)。私は説明の目的でここに入れますが、はこれを使わないでください!

<?php 
$result = []; 
$result["store"]["this"]["here"] = "test"; 
$key = "['store']['this']['here']"; 

var_dump(eval("echo \$result".$key.";")); // test 

あなたが動作するように、このために引用符の間にキーを格納(または、後で引用符を追加)する必要があります。しかし、あなたはがこれをしないので、あなたはしません!あなたはそのPHPは配列のようにそれを処理しない[]の文字列中括弧を作成している連結文字列で

Demo

1

あなたは場所からキーを解析するために正規表現を使用することができます(構文解析が動的に異なる深さの鍵に適応されます> 0):

$result['settings'] = ['store'=>['this'=>['here'=>'stored value']]]; 
$location = "[store][this][here]"; 

preg_match_all('/\[(\w+)\]/',$location, $matches); 
$keys = $matches[1]; 

$value = $result['settings'][current($keys)]; 
while(next($keys)) $value = $value[current($keys)]; 

echo $value; // 'stored value' 

demo

ユーザーが入力した入力にeval()を使用する場合は注意が必要です。

+0

私は '[store] [here]'や '[store] [here] [here]'のような動的な場所では動作しないと思っています – C2486

+0

私はあなたに 'eval入力。 – C2486

+1

@ user2486良い点。私はそれをよりダイナミックにしました。 – BeetleJuice