Просто интересно, есть ли способ обойти это (или если это возможно).
Поэтому у меня есть раздел кода, подобный этому. У меня есть строка со значением, содержащим квадратные скобки, аналогичные тем, которые используются при доступе к ключу массива. Я хочу создать этот самый массив ключей, используя значение строк. Надеюсь, этот код немного лучше понимает, что я имею в виду.
// 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'.
Однако, похоже, он не может правильно работать. Возможно ли (или как еще я могу это сделать)?
Ниже приведен пример, следующий за синтаксисом имени переменной, который также разрешает элементы массива:
// 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'