PHP - 使用存储的值作为数组键

时间:2017-10-16 10:11:15

标签: php arrays

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]}]

4 个答案:

答案 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'

demo

我会谨慎使用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

Demo

另一种方式,但非常不安全,特别是因为这来自用户输入,是使用eval()。它会执行你传入的任何参数作为PHP代码(看看有多危险?)。我会把它放在这里用于演示目的,但不要使用它!

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

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

您需要将密钥存储在引号之间才能使用(或稍后添加引号)。但你不会,因为你不会这样做!

Demo

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

现场演示: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