Посмотрите, у меня есть такая форма:
<form method="post"> <input name="variable[var1][var2]" value="44"/> </form>
Я хочу получить значение variable[var1][var2]
в PHP, используя строку типа:
$str = "['variable']['var1']['var2']"; echo "{$_POST{$str}}";
Зачем мне это нужно?
Мне нужно это, потому что код, который получает значение, полностью динамичен, и я не могу получить или установить вручную значение, используя $_POST['variable']['var1']['var2']
.
Вы можете помочь?
ПРИМЕЧАНИЕ . Я знаю, что это можно получить с помощью $_POST['variable']['var1']['var2']
, пожалуйста, не спрашивайте меня о том, почему я не использую этот способ. Просто мне нужно использовать как указано выше (используя $str
).
Вы можете использовать preg_match_all()
чтобы получить все индексы в строке в массив:
$indexes = preg_match_all('/(?<=\[\')(?:[^\']*)(?=\'\])/', $str); $indexes = $indexes[0]; // Get just the whole matches
Затем используйте цикл для сверления в $_POST
.
$cur = $_POST; foreach ($indexes as $index) { $cur = $cur[$index]; }
В этот момент $cur
будет содержать $cur
значение.
Вы ПУТЬ переусердствовали. Все, что вы помещаете в нотацию []
массива в поле имени формы, просто станет ключом массива. Ниже приведено все, что вам нужно:
<input name="foo[bar][baz][qux]" ... /> $val = $_POST['foo']['bar']['baz']['qux'];
Вы не можете использовать строку в качестве «адреса» в массиве, не без безумно уродливых хаков, таких как eval
, или синтаксический анализ строки и выполнение цикла для eval
в массиве.
Трудно поверить, что это требование. Если бы вы могли больше расширить то, что вы пытаетесь достичь, у кого-то, несомненно, есть лучшее решение. Однако я проигнорирую eval = evil
ненавистники.
Чтобы эхо:
eval("echo \$_POST$str;");
Назначение переменной:
eval("\$result = \$_POST$str;");
Если вы открыты для другого синтаксиса, проверьте, как написать getter / setter для доступа к многоуровневому массиву с помощью имен ключей?