Переменные PHP, сделанные с помощью foreach

У меня есть несколько переменных, поступающих из массива в $ 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