2017-10-16 31 views
3

PHP有一個方便的功能,允許在一個形式「預創建」數組鍵:現在PHP - 使用存儲值作爲數組鍵

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

,在數據庫中我已存儲的「位置」一定值時,使用這個字段值:

[store][this][here] 

我要調用以陣列呼叫此值,這樣的:

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

其然後會變成:

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

我如何構建我的電話做到這一點?

我曾嘗試以下,但無濟於事:

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

回答

0

通過字符串串聯你創建的[串括號和]這麼說PHP不是像數組處理它。要麼你需要分析它像這樣

<?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; 
?> 

現場演示:https://eval.in/880737

或者,如果沒有用戶輸入,那麼你可以使用一個襯墊代碼eval

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

現場演示:https://eval.in/880753

我這樣直接使用就像這樣$result[settings][store][this][here];也會有一些注意事項。但是當你通過串聯來創建大括號時,不會將其視爲數組。

現場演示:https://eval.in/880743

0

從數據庫中刪除括號,並使用;到它們分開。

你將它存儲在這樣settings;store;this;value

數據庫然後使用explode將其存儲在一個數組$array = explode(';', $databasestring);

呼應的結果是這樣的:

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

這實際上不是一個壞主意。但我想一次調用相應的(最後一個)數組鍵,而無需手動移動。沒有可用於完成該功能的功能嗎? 有點像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 

你需要存儲報價之間的鍵這個工作(或者,在以後添加引號)。但你不會,因爲你不會這樣做!

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

對於 – C2486

+0

,我認爲它不適用於像[[store] [here]'和[store] [this] [here]這樣的動態位置我也同意你在用戶提供的''eval輸入。 – C2486

+1

@ user2486好點。我讓它更具活力。 – BeetleJuice