Переменные переменной PHP с ключом массива

Просто интересно, есть ли способ обойти это (или если это возможно).

Поэтому у меня есть раздел кода, подобный этому. У меня есть строка со значением, содержащим квадратные скобки, аналогичные тем, которые используются при доступе к ключу массива. Я хочу создать этот самый массив ключей, используя значение строк. Надеюсь, этот код немного лучше понимает, что я имею в виду.

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

Однако, похоже, он не может правильно работать. Возможно ли (или как еще я могу это сделать)?

Solutions Collecting From Web of "Переменные переменной PHP с ключом массива"

Ниже приведен пример, следующий за синтаксисом имени переменной, который также разрешает элементы массива:

 // 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 не предлагает функции языка, которые вы ищете.

См. Также связанный с этим вопрос: используйте строки для доступа (потенциально большие) многомерные массивы .

В переменных переменных символы в строке обрабатываются буквально. Они не интерпретируют то, что внутри строки. Таким образом, [] символы в $string не рассматриваются как запись массива. Скорее, он рассматривается как часть имени переменной.

после выполнения $$string = 'thisworks'; PHP создает переменную с именем welcome["hello"] буквально со значением, заданным для thisworks .

Чтобы напечатать это, используйте это обозначение,

 print (${'welcome["hello"]'}); 

Нет, вы не можете так поступать. В качестве альтернативы вы можете установить опорную переменную, используя

 $welcomeHello = &$welcome["hello"] 

а затем использовать

 $welcomeHello = 'thisworks' 

для настройки содержимого элемента.

Это будет более правильным и даже более быстрым способом для установки элементов массива.

Вы можете использовать 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'