Вам не нужен цикл, вам нужно извлечь :
extract($_POST); // But use caution, see below
Меры предосторожности и рекомендации
Как отмечено в комментариях , это приводит к тому, что все параметры в массиве $_POST
переводятся в текущее пространство символов.
Inглобальное пространство
<?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, которые не перезаписывают .
Лучший вариантиспользовать, на мой взгляд, просто префикс всех переменных из extract:
// $_GET = test=1&name=Joe
extract($_GET, EXTR_PREFIX_ALL, "request_get");
echo $request_get_test; // 1
echo $request_get_name; // Joe
Таким образом, у вас не возникает проблем с перезаписью, но вы также знаете, что получили все из массива.
Alternate - looping with / conditional
Если вы хотите сделать это вручную (но все же динамически), или хотели бы условно извлечь только несколько переменных, вы можете использовать переменные переменные :
foreach ($_POST as $key => $value) {
if (isset($$key)) continue;
$$key = $value;
}
(примерное условие, которое я использовал, - это предотвращение перезаписи.)