带有数组键的PHP变量变量

时间:2012-05-05 23:27:43

标签: php

只是想知道是否有办法(或者甚至可能)。

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

// 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'.
但是,

似乎无法让它正常工作。是否有可能(或者我还能怎么做)?

5 个答案:

答案 0 :(得分:5)

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

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

要打印它,请使用此表示法

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

答案 1 :(得分:4)

以下是遵循解析数组成员的变量名语法的示例:

// 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就不会提供您正在寻找的语言功能。

请参阅相关问题:use strings to access (potentially large) multidimensional arrays

答案 2 :(得分:1)

不,你不能这样做。 或者,您可以使用设置参考变量

$welcomeHello = &$welcome["hello"]

然后使用

$welcomeHello = 'thisworks'

用于设置项目内容。

这对于设置数组项更为正确,甚至更快。

答案 3 :(得分:0)

你可以使用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'

答案 4 :(得分:0)

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

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