PHP有一个方便的功能,允许"预创建"表单中的数组键:
<input type="text" name="settings[store][this][here]" />
现在,在数据库中,我已经存储了&#34;位置&#34;某个值,使用此字段值:
[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 :(得分:1)
您可以使用正则表达式来解析该位置的键(解析将动态适应不同深度的键&gt; 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'
我会谨慎使用eval()
用户提供的输入。
答案 1 :(得分:0)
从数据库中删除括号,并使用;
分隔它们。
您可以将其存储在数据库中,如settings;store;this;value
然后使用explode
将其存储在数组$array = explode(';', $databasestring);
回复这样的结果:
echo $result[$array[0]][$array[1]][$array[2]][$array[3]];
答案 2 :(得分: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
另一种方式,但非常不安全,特别是因为这来自用户输入,是使用eval()
。它会执行你传入的任何参数作为PHP代码(看看有多危险?)。我会把它放在这里用于演示目的,但不要使用它!:
<?php
$result = [];
$result["store"]["this"]["here"] = "test";
$key = "['store']['this']['here']";
var_dump(eval("echo \$result".$key.";")); // test
您需要将密钥存储在引号之间才能使用(或稍后添加引号)。但你不会,因为你不会这样做!
答案 3 :(得分: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;
?>
如果没有用户输入,那么您可以使用eval
eval('$final = $result[settings]'.$vars.';');
echo $final;
我直接使用这样的$result[settings][store][this][here];
也会有所帮助。但是当您通过串联连接创建时,不会将括号视为数组。