У меня есть несколько переменных, поступающих из массива в $ POST _ ['array']. Я хочу сделать какой-то цикл, например foreach, который делает для каждого значения переменной имя переменной и присваивает ему значение.
Например, если у меня есть
$POST_['name']; $POST_['last']; $POST_['age']; $POST_['sex'];
Я хочу, чтобы цикл создавал каждую переменную из массива внутри $ _POST с именем переменной, как показано ниже:
$name = 'John'; $last = 'Doe'; $age = '32'; $sex = 'male';
ПРИМЕЧАНИЕ. Массив исходит из сериализованной строки jquery, которая объединяет все переменные и значения в форме в одну большую строку.
Это возможно?
Вам не нужен цикл, вы хотите извлечь :
extract($_POST); // But use caution, see below
Как отмечено в комментариях, это заставляет все параметры массива $_POST
в текущее пространство символов.
<?php extract($_GET); var_dump($_SERVER); // Can be overwritten by the GET param ?>
В приведенном выше коде показана проблема, как показано в этом ответе – некоторые довольно опасные вещи могут быть перезаписаны в глобальном пространстве.
function myFunc() { // (Mostly) empty symbol space! (excluding super globals) extract($_POST); }
Внутри функции, как первая строка, никакого вреда не делается.
Важное примечание. Вы можете подумать, что $_SERVER
является супер-глобальным , что этот эксплойт может произойти и внутри функции. Тем не менее, в моем тестировании, на PHP версии 5.3.4 , он безопасен внутри функции – не могут быть перезаписаны ни $_SERVER
, $_POST
, $_GET
, $_SESSION
, ни предположительно другие суперглобалы.
Вы также можете использовать extract с параметрами extract_type, которые не перезаписываются .
Лучший вариант использования, на мой взгляд, – это просто префикс всех переменных извлечения:
// $_GET = test=1&name=Joe extract($_GET, EXTR_PREFIX_ALL, "request_get"); echo $request_get_test; // 1 echo $request_get_name; // Joe
Таким образом, у вас нет проблемы с перезаписью, но вы также знаете, что у вас есть все, что есть в массиве.
Если вы хотите сделать это вручную (но все еще динамически) или хотите условно извлечь только некоторые из переменных, вы можете использовать переменные переменные :
foreach ($_POST as $key => $value) { if (isset($$key)) continue; $$key = $value; }
(Условие примера, которое я использовал, является предотвращением перезаписи).
Старайтесь не использовать extract()
при использовании $_POST
. Вы можете перезаписать переменные, которые вы хотите, что приведет к непредсказуемому поведению. Это плохая привычка, и в то время как динамика не может быть лучшим решением.
Вы можете сделать что-то вроде этого:
foreach($_POST as $key => $value) { switch($key) { case "name": $name = $value; break; case "last": $last = $value; break; } }
Почему бы не использовать foreach
?
foreach($_POST as $key=>$val){ ${$key} = $val; }
Фактически вы можете использовать встроенную функцию extract