我有一个多维关联数组,其中包含
等元素$data["status"]
$data["response"]["url"]
$data["entry"]["0"]["text"]
我有一个字符串:
$string = 'data["status"]';
$string = 'data["response"]["url"]';
$string = 'data["entry"]["0"]["text"]';
如何将字符串转换为变量以访问正确的数组元素?此方法需要在任何维度上跨任何数组工作。
答案 0 :(得分:52)
PHP的variable variables会帮助你。您可以通过在变量前添加另一个美元符号来使用它们:
$foo = "Hello, world!";
$bar = "foo";
echo $$bar; // outputs "Hello, world!"
答案 1 :(得分:16)
又快又脏:
echo eval('return $'. $string . ';');
当然首先需要对输入字符串进行清理。
如果你不喜欢快速和肮脏...那么这也会起作用,它不需要eval,这甚至让我感到畏缩。
然而,它确实对字符串格式做出了假设:
<?php
$data['response'] = array(
'url' => 'http://www.testing.com'
);
function extract_data($string) {
global $data;
$found_matches = preg_match_all('/\[\"([a-z]+)\"\]/', $string, $matches);
if (!$found_matches) {
return null;
}
$current_data = $data;
foreach ($matches[1] as $name) {
if (key_exists($name, $current_data)) {
$current_data = $current_data[$name];
} else {
return null;
}
}
return $current_data;
}
echo extract_data('data["response"]["url"]');
?>
答案 2 :(得分:6)
这可以通过更简单的方式完成。您所要做的就是考虑PHP提供的创建变量的函数。
$string = 'myvariable';
extract(array($string => $string));
echo $myvariable;
完成!
答案 3 :(得分:0)
在Variable variables页面上找到了这个:
function VariableArray($data, $string) {
preg_match_all('/\[([^\]]*)\]/', $string, $arr_matches, PREG_PATTERN_ORDER);
$return = $arr;
foreach($arr_matches[1] as $dimension) { $return = $return[$dimension]; }
return $return;
}
答案 4 :(得分:0)
我也在努力, 我有这个:
$user = array('a'=>'alber', 'b'=>'brad'...);
$array_name = 'user';
我想知道如何进入阿尔伯特。
起初我试过
$value_for_a = $$array_name['a']; // this dosen't work
然后
eval('return $'.$array_name['a'].';'); // this dosen't work, maybe the hoster block eval which is very common
然后我终于尝试了愚蠢的事情:
$array_temp=$$array_name;
$value_for_a = $array_temp['a'];
这才刚刚完美! 智慧,做到这一点很简单。
我希望这能回答你的问题
答案 5 :(得分:0)
您可以通过引用传递给运算符&
。所以在你的例子中你会有类似的东西
$string = &$data["status"];
$string = &$data["response"]["url"];
$string = &$data["entry"]["0"]["text"];
否则你需要做这样的事情:
$titular = array();
for ($r = 1; $r < $rooms + 1; $r ++)
{
$title = "titular_title_$r";
$firstName = "titular_firstName_$r";
$lastName = "titular_lastName_$r";
$phone = "titular_phone_$r";
$email = "titular_email_$r";
$bedType = "bedType_$r";
$smoker = "smoker_$r";
$titular[] = array(
"title" => $$title,
"first_name" => $$firstName,
"last_name" => $$lastName,
"phone" => $$phone,
"email" => $$email,
"bedType" => $$bedType,
"smoker" => $$smoker
);
}
答案 6 :(得分:0)
这有本机PHP功能: 使用http://php.net/manual/ru/function.parse-str.php(parse_str())。
在解析之前不要忘记从'''清除字符串。
答案 7 :(得分:0)
也许这个选项也适用:
$data["entry"]["0"]["text"];
$string = 'data["entry"]["0"]["text"]';
function getIn($arr, $params)
{
if(!is_array($arr)) {
return null;
}
if (array_key_exists($params[0], $arr) && count($params) > 1) {
$bf = $params[0];
array_shift($params);
return getIn($arr[$bf], $params);
} elseif (array_key_exists($params[0], $arr) && count($params) == 1) {
return $arr[$params[0]];
} else {
return null;
}
}
preg_match_all('/(?:(\w{1,}|\d))/', $string, $arr_matches, PREG_PATTERN_ORDER);
array_shift($arr_matches[0]);
print_r(getIn($data, $arr_matches[0]));
P.S。这对我有用。
答案 8 :(得分:-1)
您可以像访问它们一样访问它们:
print $$string;