7

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

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

// 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'.

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

4

5 回答 5

6

以下是一个遵循变量名称语法的示例,它也解析数组成员:

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

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

于 2012-05-06T13:18:26.673 回答
5

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

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

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

print (${'welcome["hello"]'});
于 2012-05-05T23:38:24.027 回答
1

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

$welcomeHello = &$welcome["hello"]

然后使用

$welcomeHello = 'thisworks'

用于设置项目内容。

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

于 2012-05-05T23:38:19.460 回答
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'
于 2012-05-05T23:35:08.267 回答
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

于 2019-08-07T22:46:32.890 回答