Ваша проблема в том, что у вас есть индекс массива, и это не поддерживается синтаксисом "переменных переменных" в PHP.
Я знаю, что это своего рода магия, но вы можете сделать это без использования зла eval()
.
Обратите внимание: это всего лишь доказательство концепции, чтобы показать, что это возможно.
Что вам действительно нужно, это рефакторинг вашего кода таким образом, чтобы такой взлом не был необходим .
$bar = "hallo";
$foo['bar']['baz'] = "hallo2";
$properties = array('bar', "foo['bar']['baz']");
// DOES NOT WORK
foreach ($properties as $property)
echo "$property = ", $$property, "\n";
/* Results in:
* bar = hallo
* foo['bar']['baz'] = PHP Notice: Undefined variable: foo['bar']['baz'] in /tmp/test.php on line 8
*/
// DOES WORK
foreach ($properties as $property)
echo "$property = ", get_var($property), "\n";
/* Results in:
* bar = hallo
* foo['bar']['baz'] = hallo2
*/
// dark magic starts here
function get_var($name) {
if (strpos($name, '[') === false) {
global $$name;
return $$name;
} else {
// split variable name into array name and nested index segments
preg_match_all("#[^\[\]\"']+#", $name, $parts);
$parts = $parts[0];
// get pointer to array and walk down to the desired (nested) index
$varname = array_shift($parts);
global $$varname;
$pointer =& $$varname;
foreach ($parts as $index) {
$pointer =& $pointer[$index];
}
return $pointer;
}
}