带有数组键的 PHP 变量变量


PHP Variable Variables with array key

只是想知道是否有办法解决这个问题(或者是否有可能)。

所以我有一段与此类似的代码。我有一个字符串,其值包含方括号,类似于访问数组键时使用的值。我想使用字符串值本身创建该数组键。我希望这段代码能更理解我的意思。

// String that has a value similar to an array key
$string = 'welcome["hello"]';
$$string = 'thisworks';
// I could then print the array keys value like this
print( $welcome["hello"] );
// This would hopefully output 'thisworks'.

但是,似乎无法使其正常工作。有可能吗(或者我还能怎么做)?

下面是遵循

变量名称语法的示例,该语法也解析数组成员:

// String that has a value similar to an array key
$string = 'welcome["hello"]';
// initialize variable function (here on global variables store)
$vars = $varFunc($GLOBALS);
// alias variable specified by $string
$var = &$vars($string);
// set the variable
$var = 'World';
// show the variable
var_dump($welcome["hello"]); # string(5) "World"

通过以下实现:

/**
 * @return closure
 */
$varFunc = function (array &$store) {
    return function &($name) use (&$store)
    {
        $keys = preg_split('~("])?(''["|$)~', $name, -1, PREG_SPLIT_NO_EMPTY);
        $var = &$store;
        foreach($keys as $key)
        {
            if (!is_array($var) || !array_key_exists($key, $var)) {
                $var[$key] = NULL;
            }
            $var = &$var[$key];
        }
        return $var;
    };
};

由于你不能在 PHP 中重载变量,所以这里仅限于 PHP 的表现力,这意味着没有变量引用作为函数返回值的写入上下文,这需要额外的别名:

$var = &$vars($string);
如果

这样的东西不适合你的需求,你需要修补PHP,如果不是选项,PHP不提供你正在寻找的语言功能。

另请参阅相关问题:使用字符串访问(可能很大的)多维数组。

变量变量中,字符串中的字符按字面处理。它们不解释字符串内的内容。因此$string中的[]字符不被视为数组表示法。而是将其视为变量名称的一部分。

执行$$string = 'thisworks';后,PHP 会创建一个变量,其名称welcome["hello"]字面意思是值设置为 thisworks

要打印它,请使用此符号,

print (${'welcome["hello"]'});

不,你不能以这种方式这样做。或者,您可以使用以下方法设置引用变量

$welcomeHello = &$welcome["hello"]

,然后使用

$welcomeHello = 'thisworks'

用于设置项目内容。

这将是设置数组项的更正确、更快捷的方法。

您可以使用 eval,尽管我真的不建议在生产环境中使用它,但它确实有其好处。

<?
$string = 'welcome["hello"]';
eval('$' . $string . " = 'thisworks';");
// This also works : eval("$$string = 'thisworks';");
// I could then print the array keys value like this
print( $welcome["hello"] ); // Prints 'thisworks'

您可以使用两个变量,一个用于保存引用的变量名称,另一个用于保存密钥:

<?php
$myArray = array('foo', 'bar', 'baz');
$varName = 'myArray';
$varKey  = 1;
echo ${$varName}[$varKey];
// will echo "bar"

根据为什么大括号用于取消引用$varName

为了将变量变量与数组一起使用,您必须解决歧义问题。 也就是说,如果你写$$a[1]那么解析器需要知道你是否打算使用 $a[1] 作为变量,或者你是否希望$$a作为变量,然后是该变量的 [1] 索引。 解决这种歧义的语法是:第一种情况为 ${$a[1]},第二种情况为 ${$a}[1]

(来自 https://www.php.net/manual/en/language.variables.variable.php)