获取基于变量和索引的数组值为字符串

时间:2016-11-18 10:04:49

标签: php arrays eval

我试图执行变量,哪一部分是字符串。

这是:

$row = array(
    'index_1' => array(
         'index_2' => 'my-value'
     )
);
$pattern = "['index_1']['index_2']";

我试图通过以下方式实现:

// #1
$myValue = $row{$pattern};

// #2
$myValue = eval("$row$pattern");

我也尝试使用变量变量,但不成功。

任何提示,我该怎么做?或者myabe还有其他方式。我不知道怎么看阵列,但我只有关键索引的名称(由用户提供),这是:index_1index_2

4 个答案:

答案 0 :(得分:0)

您可以使用eval,但由于您说这些值来自用户输入,因此风险很大。在这种情况下,最好的方法可能是解析字符串并提取密钥。这样的事情应该有效:

$pattern = "['index_1']['index_2']";
preg_match('/\[\'(.*)\'\]\[\'(.*)\'\]/', $pattern, $matches);

if (count($matches) === 3) {
    $v = $row[$matches[1]][$matches[2]];
    var_dump($v);
} else {
    echo 'Not found';
}

答案 1 :(得分:0)

这可以提供帮助 -

$row = array(
    'index_1' => array(
         'index_2' => 'my-value'
     )
);
$pattern = "['index_1']['index_2']";
$pattern = explode("']['", $pattern); // extract the keys

foreach($pattern as $key) {
    $key = str_replace(array("['", "']"), '', $key); // remove []s
    if (isset($row[$key])) { // check if exists
        $row = $row[$key]; // store the value
    }
} 

var_dump($row);

如果进一步使用,则需要将$row存储在临时变量中。

<强>输出

string(8) "my-value"

答案 2 :(得分:0)

如果您总是收到两个索引,那么解决方案非常简单,

$index_1 = 'index_1';// set user input for index 1 here
$index_2 = 'index_2';// set user input for index 2 here

if (isset($row[$index_1][$index_2])) {
    $myValue = $row[$index_1][$index_2];
} else {
    // you can handle indexes that don't exist here....
}

如果提交的索引总是不成对,那么就可以了,但我需要更新我的答案。

答案 3 :(得分:0)

因为eval不安全,只有当你知道自己在做什么时才会这样。 $ myValue = eval(“$ row $ pattern”);将您想要的值分配给$ myValue,您可以添加use return以使eval返回您想要的值。 这是使用eval的代码,谨慎使用它。 demo here.

<?php
$row = array(
    'index_1' => array(
         'index_2' => 'my-value'
     )
);
$pattern = 'return $row[\'index_1\'][\'index_2\'];';
$myValue = eval($pattern);
echo $myValue;