只是想知道是否有办法(或者甚至可能)。
所以我有一段类似于此的代码。我有一个字符串,其值包含方括号,类似于访问数组键时使用的字符串。我想通过使用字符串值来创建该数组键。我希望这段代码能更清楚我的意思。
// 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'.
但是,似乎无法让它正常工作。是否有可能(或者我还能怎么做)?
答案 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)