2010-08-03 2 views
4

Это то, что я хочу:Foreach цикл с несколькими массивами


foreach($_POST['something'] as $something){ 
    foreach($_POST['example'] as $example){ 
     $query = mysql_query("INSERT INTO table (row, row2) VALUES ('{$something}','{$example}')"); 
    } 

} 

$_POST['something'] и $_POST['example'] массивы от входа с

name="something[]" и name="example[]".

Проблема:


В этом случае я буду посылать данные дважды в базу данных. Поэтому мне нужно решение, в котором я могу зацикливаться на 2 массивах, не сводя данные дважды.

РЕДАКТИРОВАТЬ

  • Два массива всегда будет иметь тот же размер
  • В mysql_query я будет иметь другие элементы, а не только грести, ROW2, и те будут без какого-либо статического массива.
+1

Я не понимаю, как вы отправляете данные дважды. Не могли бы вы показать какой-то образец вывода, если вы положили 'echo' в' foreach'? – KLee1

ответ

11

ли вы имеете в виду что-то вроде:

foreach($_POST['something'] as $key => $something) { 
    $example = $_POST['example'][$key]; 
    $query = mysql_query("INSERT INTO table (row, row2) VALUES ('{$something}','{$example}')"); 
} 
+0

Если $ _POST [example] имеет больше значений, чем $ _POST [что-то], тогда некоторые из значений будут потеряны – Cfreak

+0

Я пытаюсь точно интерпретировать то, что задает ОП, основываясь на его комментарии по отправке данных в базу данных дважды , Мое подозрение в том, что это то, что он имеет в виду, но с трудом объясняет –

+1

Ну, это работает, однако я получаю сообщение об ошибке: 'Предупреждение: неверный аргумент, предоставленный foreach() в example.php в строке 63', но я точно использовал вы написали. – Adam

1

Ваше решение, похоже, не отправляет данные дважды. Если в результате выдачи ваших запросов появятся записи с одинаковыми значениями. Это может означать, что вы должны обработать свои данные, прежде чем создавать свои запросы.

Одним из решений может быть:

$sql = array(); 

foreach($_POST['something'] as $something){ 
    foreach($_POST['example'] as $example){ 
    $sql[] = "INSERT INTO table (row, row2) VALUES ('{$something}','{$example}')"; 
} 
} 

foreach($sql as $query){ 
    mysql_query($query); 
} 
1
$cnt = count($_POST['something']); 
$cnt2 = count($_POST['example']); 

if ($cnt > 0 && $cnt == $cnt2) { 
    $insertArr = array(); 
    for ($i=0; $i<$cnt; $i++) { 
     $insertArr[] = "('" . mysql_real_escape_string($_POST['something'][$i]) . "', '" . mysql_real_escape_string($_POST['example'][$i]) . "')"; 
    } 

    $query = "INSERT INTO table (column, column2) VALUES " . implode(", ", $insertArr); 
    mysql_query($query) or trigger_error("Insert failed: " . mysql_error()); 
} 

Вот другой метод. В этом случае используются расширенные вставки, поэтому они должны быть более эффективными и быстрыми, а для обеспечения безопасности используется mysql_real_escape_string. Проверка счета заключается в том, чтобы убедиться, что оба поля имеют одинаковый счет, если нет, то я считаю, что это несчастье. Если им разрешено иметь другое количество полей, вы можете просто использовать функцию isset() для проверки, чтобы убедиться, что они содержат значение.

EDIT

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

Добавлен тест массива вставки, если нет элементов, которые не нужно обновлять. Спасибо Гумбо за это.

+1

Вы должны проверить, действительно ли '$ insertArr' имеет элементы. – Gumbo

+0

Да, хороший звонок. Для этого добавлен оператор if. –

+0

@premiso: Почему бы просто не добавить условие '$ cnt> 0' в' $ cnt == $ cnt2'? – Gumbo

1

Я думаю, что лучше всего было бы, как единый контур для создания запроса. Это должно работать, даже если ваши массивы не такой же длины:

$size1 = count($_POST['something']); 
$size2 = count($_POST['example']); 
if($size1 >= $size2) { 
    $size = $size1; 
} else { 
    $size = $size2; 
} 

$sql = "INSERT INTO table (row, row2) VALUES"; 
$values = array(); 
for($i=0; $i<$size; $i++) { 
    $values[] = "('" . mysql_real_escape_string($_POST['something'][$i]) . "','" . mysql_real_escape_string($_POST['example'][$i]) . "')"; 
} 

$sql .= implode(",", $values); 

mysql_query($sql); 

Также более безопасна, поскольку она ускользает ввод. Это также было бы еще проще с использованием заполнителей с PDO.

1

Хотя вы уже выбрали ответ, не забывайте, что этот фрагмент скрипта может завершиться неудачно, если значения POST не являются массивами.Вы можете преодолеть это с небольшой кусочек кода:

$something = is_array($_POST['something']) ? $_POST['something'] : array(); 
$example = is_array($_POST['example']) ? $_POST['example'] : array(); 

/* Get all the keys from both arrays 
* If they don't share the keys, none will be lost 
*/ 
$keys = array_merge(array_keys($something),array_keys($example)); 
$keys = array_unique(); 

if (count($keys)) { 
    $sql = 'INSERT INTO table (row, row2) VALUES '; 
    $values = array(); 

    foreach ($keys as $key) { 
     // Single quotes for PHP, we are not expanding variables 
     // If the element cannot be converted into a string, don't show the error on screen 
     $values[] = '("' . @mysql_real_escape_string($something[$key]) . '","' . @mysql_real_escape_string($example[$key]) . '")'; 
    } 

    $sql .= implode(',', $values); 
    mysql_query($sql); 
} 
2

РЕШЕНИЯ ДЛЯ НЕСКОЛЬКИХ Массивы

TRY -

1)

<?php 
$ZZ = array('a', 'b', 'c', 'd'); 
$KK = array('1', '2', '3', '4'); 

foreach($ZZ as $index => $value) { 
    echo $ZZ[$index].$KK[$index]; 
    echo "<br/>"; 
} 
?> 

или 2)

<?php 
$ZZ = array('a', 'b', 'c', 'd'); 
$KK = array('1', '2', '3', '4'); 

for ($index = 0 ; $index < count($ZZ); $index ++) { 
    echo $ZZ[$index] . $KK[$index]; 
    echo "<br/>"; 
} 
?> 
+0

Почему вы публикуете тот же ответ на каждый такой же пост, как этот? Просто одного достаточно ... – j0k

+0

Первое решение сработало для меня. Благодаря :) –

0

Цикл Foreach с несколькими массивы:

foreach($_POST['quantity'] as $key=>$quantity) 
{ 
    $product_no=$_POST['product_id'][$key]; 
    echo $product_no; 
    echo $quantity; 
} 
Смежные вопросы