2014-10-07 3 views
1

У меня есть несколько dynamicaly построить поля ввода в форме, которая выглядит следующим образом:извлечения числовой индексированный массив в PHP

<input type="text" class="form-control" name="person[]" placeholder="Person" /> 
<input type="text" class="form-control" name="function[]" placeholder="Function" /> 

<input type="text" class="form-control" name="person[]" placeholder="Person" /> 
<input type="text" class="form-control" name="function[]" placeholder="Function" /> 

<input type="text" class="form-control" name="person[]" placeholder="Person" /> 
<input type="text" class="form-control" name="function[]" placeholder="Function" /> 

Потому что я пишу свое имя входа, как это: person[] & function[] я получаю числовое индексируется массив в моем массиве $_POST. Поскольку поля ввода производятся динамически, неизвестно, сколько person[] & function[] номера индексов будут в $_POST.

Как я могу справиться с этим? Другими словами, что, если я хотел бы INSERTperson[0] + function[0] & person[1] + function[1] + ... (переменная величина своих функций) в мою базу данных? как я могу извлечь это, чтобы это можно было сделать?

ПРИМЕЧАНИЕ: Каждый человек имеет свою собственную функцию, поэтому важно, чтобы он оставался вместе.

я не получил очень далеко, так что я не могу предоставить больше коды, я попробовал:

foreach ($_POST['person'] as $value){ 
... 
} 

Это дает мне список этого конкретного массива person[] внутри $_POST, но это не полезное для меня.

+0

Вы пробовали использовать встроенную функцию 'count' php? –

+0

Просто используйте функцию count или используйте цикл foreach ... – Anas

+0

- эти входы динамические, то есть есть кнопка '+ add more', которая включает javascript? – Ghost

ответ

2

Похоже, что существует столько же «людей», сколько есть «функций». Если это так, то вы можете сделать что-то вроде этого:

foreach($_POST['person'] as $key => $value) { 
    echo 'Person ' . $value . ' has function ' . $_POST['function'][$key] . '<br>'; 
} 
+0

вы можете добавить: 'if (count ($ _ POST ['person']) == count ($ _ POST ['function']) {...' – Steve

0

Что-то, как это будет, вероятно, работать

$sql = "INSERT INTO tbl (Person,Function) VALUES "; 
$components = array(); 

$totalitemcount = count($_POST['person']); 

for ($i=0;$i<=$totalitemcount;$i++) { 
    $components[] = "('".$_POST['person'][$i]."','".$_POST['function'][$i]."')"; 
} 

$insertstring = implode(",",$components); 

$finalsql = $sql.$insertstring; 

//do insert here 
+0

вы должны заметить, что нет абсолютно никаких экранов данных, и это склонен к sql-инъекции – Sharky

+1

aye забыл упомянуть, что бит :) пользователь должен действительно сделать это самостоятельно или в идеале использовать pdo/mysqli подготовить и т. д. – Dave

+0

Я попробую, посмотрите, что лучше, и вернитесь! @Sharky я знаком с PDO и подготовленными операторами & binds;), так что это не проблема. Спасибо, в любом случае! – Peter

1

получить два массива персоны клавиши [], как $ и функция [], как $ значения теперь создаем новый массив, один из которых является ключевым, а другой - значениями нового массива.
$ins= array_combine(array $keys, array $values);
foreach ($ ins as $ person => $ fun) {
$ insert = $ person + $ fun;
// в настоящее время вопрос о противопожарной установке }

1

Этот дизайн формы приведет к проблемам, если у вас нет способа гарантировать, что человек и функциональные входы каким-либо образом связаны. Представьте себе, что кто-то, заполнив форму, и они покидают функцию заготовку для одного человека:

Person Function 

Anna  array_map 
Betty 
Claire count 
      date_format 

Вместо того, чтобы знать, что функция Betty «s является пустой, то форма логика пара Betty с count и Claire с date_format. Поэтому лучше группировать каждую комбинацию лиц/функций с идентификатором, чтобы вы могли различать их. Достаточно легко сделать итератор в JS или PHP.

Новая форма:

<input type="text" class="form-control" name="persfunc[1][p]" placeholder="Person" /> 
<input type="text" class="form-control" name="persfunc[1][f]" placeholder="Function" /> 

<input type="text" class="form-control" name="persfunc[2][p]" placeholder="Person" /> 
<input type="text" class="form-control" name="persfunc[2][f]" placeholder="Function" /> 

<input type="text" class="form-control" name="persfunc[3][p]" placeholder="Person" /> 
<input type="text" class="form-control" name="persfunc[3][f]" placeholder="Function" /> 

<input type="text" class="form-control" name="persfunc[4][p]" placeholder="Person" /> 
<input type="text" class="form-control" name="persfunc[4][f]" placeholder="Function" /> 

Вы можете использовать такую ​​функцию для обработки данных:

# gather up all the 'persfunc' data from $_POST 
    if (! empty($_POST['persfunc'])) { 
     # initialise an array for the results 
     $pers_func_arr = array(); 

     foreach ($_POST['persfunc'] as $pf) { 
      # make sure that both $persfunc[x]['p'] and $persfunc[x]['f'] have values 
      if (
       isset($pf['p']) 
       && isset($pf['f']) 
       && strlen($pf['p']) > 0 
       && strlen($pf['f']) > 0 
      ) { 
       # you've got a pair! Do whatever you want with them. 

       # e.g. print out the name/function pair: 
       echo "<p>Person " . $pf["p"] 
        . " has function " . $pf["f"]."</p>"; 

       # e.g. add them to a data structure for later use 
       $pers_func_arr[] = array($pf["p"], $pf["f"]); 
      } 
     } 
    } 

Дайте эту форму хитроумных входные данные от ранее, и проверьте вывод:

Person Anna has function array_map 

Missing full data for person_2 

Person Claire has function count 

Missing full data for person_person_4 

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

Смежные вопросы