gpt4 book ai didi

PHP动态访问变量值

转载 作者:可可西里 更新时间:2023-11-01 13:37:17 26 4
gpt4 key购买 nike

我想动态访问变量的值,假设我有这个数组:

$aData = array(
'test' => 123
);

打印 test key 值的标准方法是:

print $aData['test'];

但是,如果我必须使用变量的字符串表示形式(出于动态目的)

$sItem = '$aData[\'test\']';

如何打印名为testaData key?下面提供的示例均无效

print $$sItem;
print eval($sItem);

解决方案是什么?

最佳答案

您的评估示例缺少返回值:

print eval("return $sItem;");

应该这样做:

$aData['test'] = 'foo';

$sItem = '$aData[\'test\']';

print eval("return $sItem;"); # foo

但一般不建议使用eval。你可以带着它进入 hell 的厨房,因为 eval 是邪恶的。

相反,只需解析字符串并返回值:

$aData['test'] = 'foo';

$sItem = '$aData[\'test\']';

$r = sscanf($sItem, '$%[a-zA-Z][\'%[a-zA-Z]\']', $vName, $vKey);
if ($r === 2)
{
$result = ${$vName}[$vKey];
}
else
{
$result = NULL;
}

print $result; # foo

这也可以用一些其他形式的正则表达式来完成。

由于您的语法非常接近 PHP,实际上是它的一个子集,如果您想在使用 eval 之前验证输入,您可以采取一些替代方法。该方法是检查 PHP token 并只允许一个子集。这不会验证字符串(例如语法以及是否实际设置了变量)但会使其更加严格:

function validate_tokens($str, array $valid)
{
$vchk = array_flip($valid);
$tokens = token_get_all(sprintf('<?php %s', $str));
array_shift($tokens);
foreach($tokens as $token)
if (!isset($vchk[$token])) return false;
return true;
}

您只需为该函数提供一组有效标记。这些是 PHP token ,在您的情况下是:

T_LNUMBER (305) (probably)
T_VARIABLE (309)
T_CONSTANT_ENCAPSED_STRING (315)

然后您就可以使用它了,它也适用于更复杂的键:

$aData['test'] = 'foo';
$aData['te\\\'[]st']['more'] = 'bar';

$sItem = '$aData[\'test\']';
$vValue = NULL;
if (validate_tokens($sItem, array(309, 315, '[', ']')))
{
$vValue = eval("return $sItem;");
}

我在问题 another answerreliably convert string containing PHP array info to array 中使用了这个。

关于PHP动态访问变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8356464/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com