2011-08-19 2 views
0

Может показаться глупым вопросом, но у меня возникла проблема создания массива из нескольких переменных POST. Они поступают из формы jQuery, которая может иметь любое количество переменных. Это может быть 1 из 2 вариантов, имя или школа.Любое число переменных POST в массив

Например: $_POST['name1'], $_POST['school2'], $_POST['name3'], $_POST['name4'] и т.д.

Есть ли способ, чтобы получить максимальное количество переменных и поместить каждую переменную в массив? Или есть лучший способ сделать это?

Любой ввод оценивается.

+4

'$ _POST' - это уже массив ... что еще вы хотите? Вы хотите отделить записи 'name' и' school'? –

+0

Каково максимальное количество переменных? –

+0

Вам нужно что-то вроде extract()? – Dan

ответ

6
<input name="name[]" /> 
<input name="school[]" /> 
<input name="name[]" /> 
<input name="name[]" /> 

Это то, что вы имеете в виду? PHP Form Arrays Тогда ссылочной мудр, теперь у вас есть массив для $_POST['name'] и $_POST['school']

foreach ($_POST['name'] as $name) 
{ 
    // each form element from the `name[]` inputs = $name 
} 
foreach ($_POST['school'] as $school) 
{ 
    // each form element from the `school[]` inputs = $name 
} 

В качестве альтернативы, если вы их нумерацию вы можете использовать Еогеасп по переменной $ _POST:

foreach ($_POST as $key => $val) 
{ 
    if (preg_match('/^name\d+$/',$key){ 
    // name variable 
    } else if (preg_match('/^school\d+$/',$key){ 
    // school variable 
    } 
} 
+0

Да! Это то, что я ищу. Спасибо :) – adamzwakk

+1

кстати .. нет почти никакого предела для числа переменных в сообщении. но вы можете столкнуться с вашим post_max_size ... – Flask

+0

Здравствуйте, @Flask, если есть огромное количество пост-переменных, да, это может запуститься в post_max_size. Можете ли вы предложить, как справиться с такой проблемой. Можем ли мы использовать метод ajax для отправки этих огромных пост-переменных? Будет ли снова запускаться проблема post_max_size с помощью ajax? –

0

Вы можете установить name[1] (или name[]) в качестве имени переменной вместо name
В этом случае PHP вы получите массив $_POST['name']

+0

Вы можете установить name1, name2, ... и т. Д. Но использование массивов может иметь больше смысла в зависимости от приложения/данных. Например, если вы всегда будете иметь адрес1,2 и 3, тогда массив будет излишним. – Colin

+0

@Colin, я знаю, что могу, наверное, проблема в моем английском. Надежда теперь ответ более очевидна? – RiaD

+0

Ваше редактирование делает это немного яснее, но я просто указывал, что массивы не всегда могут быть лучшим решением, так же как и статически пронумерованные post args, возможно, и не самые лучшие. – Colin

0

Вы можете использовать следующее:

foreach ($_POST as $key => $value) { 
    // parse key names/etc 
} 

Это будет разрешите вам просматривать все аргументы post. Но будьте осторожны, есть потенциальные риски для безопасности. Вам нужно будет подтвердить, что вы ставите ключ/имена очень тщательно (вы всегда должны это делать).

0

Попробуйте ввести свою форму с именами полей ввода, например school[] и name[]. Они должны быть правильно преобразованы в массивы в вашем $_POST

0

Вы можете подсчитать элементы в массиве $_POST, вызвав count($_POST).

Но да, есть лучший способ передачи переменных с помощью JQuery:

jQuery.post('/your/url/here', { 
    'name': ['Tom', 'Jerry', 'Garfield'], // passing array... 
    'school': ['MIT', 'UCLA', 'Florida State University'] // ...and another one 
}, function(data){ 
    // your callback here 
}); 

, и вы будете иметь возможность рассчитывать отдельные части данных, как, что (в PHP):

$number_of_names = count($_POST['name']); // $_POST is multidimensional array 
$number_of_schools = count($_POST['school']); 

или вы можете отобразить их (все еще в PHP):

echo 'names: ' . implode(', ',$_POST['name']) . PHP_EOL; 
echo 'schools: ' . implode(', ',$_POST['school']) . PHP_EOL; 

Помогло ли это?

0

Думаю, я понял, что вы имеете в виду;

$options = Array("school" => Array(), "names" => Array()); 
$i = 0; 
foreach($options as $key => $val){ 
    while(isset($_POST[$key.$i]) && ++$i){ 
     $options[$key] += $_POST[$key.$i]; 
    } 
} 

Форма массивы могут быть лучшим вариантом, если они не мешают некоторым другим основным функциональные возможности

проще:

$myNames = Array(); 
for($i=0; $i<1000; $i++){ 
if(!isset($_POST["school$i"])): 
    break; 
$myNames += $_POST["school$i"] 
} 
0

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

$base_names = array('name' => array(), 'school' => array()); 
foreach ($_POST as $key => $value) { 
    $key = preg_replace('/\d+$/', '', $key); 
    if (isset($base_names[$key])) { 
     $base_names[$key][] = $value; 
    } 
} 
Смежные вопросы