Переменные PHP сделаны с foreach - PullRequest
6 голосов
/ 17 мая 2011

У меня есть несколько переменных, поступающих из массива в $ POST _ ['array']. Я хочу сделать некоторый цикл, например, foreach, который делает для каждого значения в переменной его имя переменной и присваивает ему значение .

Например, если у меня есть

$POST_['name'];
$POST_['last'];
$POST_['age'];
$POST_['sex'];

Я хочу, чтобы цикл создавал каждую переменную из массива внутри $ _POST с именем переменной, как показано ниже:

$name = 'John';
$last = 'Doe';
$age = '32';
$sex = 'male';

ПРИМЕЧАНИЕ. - Массив поступает из сериализованной строки jquery, которая объединяет все переменные и значения в форме в одну большую строку.

Возможно ли это?

Ответы [ 5 ]

16 голосов
/ 17 мая 2011

Вам не нужен цикл, вам нужно извлечь :

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;
}

(примерное условие, которое я использовал, - это предотвращение перезаписи.)

12 голосов
/ 17 мая 2011

Старайтесь не использовать extract() при использовании $_POST.Вы можете перезаписывать нужные переменные, что приведет к непредсказуемому поведению.Это плохая привычка, и динамическая работа может быть не лучшим решением.

2 голосов
/ 17 мая 2011

Почему бы не использовать foreach?

foreach($_POST as $key=>$val){
    ${$key} = $val;
}
1 голос
/ 17 мая 2011

Вы можете использовать встроенную функцию под названием extract

0 голосов
/ 05 февраля 2018

Я просто хочу упомянуть, что вы можете улучшить технику foreach, потому что в HTML у нас есть возможность называть одно из полей нашей формы, используя обозначение в квадратных скобках, и если мы сделаем это, то HTML будет делать серию значения в виде массива.

<input name="user[name]">
<input name="user[last]">
<input name="user[age]">
<input name="user[sex]">

Чем использовать только одну строку кода для назначения всех значений из полей ввода в локальный массив $ args.

$args = $_POST['user'];

Так что это означает, что когда мы идем обрабатывать форму, мы смотрим на массив значений, а не на набор отдельных значений, которые мы должны получить.

Так что мы можем просто перейти к сообщению super global и попросить один пункт: это пользователь. И мы получаем ассоциативный массив. Поэтому вместо того, чтобы создавать этот массив, собирая и извлекая все эти значения по одному, мы немедленно получаем массив только потому, что мы назвали наши поля формы по-разному.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...