Цикл 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 у меня будут другие элементы, а не только row, row2, и они будут статическими без какого-либо массива.

Related of "Цикл Foreach с несколькими массивами"

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

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

РЕШЕНИЕ ДЛЯ МНОЖЕСТВЕННЫХ МАСТЕРОВ

ПЫТАТЬСЯ –

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/>"; } ?> 

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

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

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

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

 $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.

 $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 () для проверки, чтобы убедиться, что они содержат значение.

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

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

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

Хотя вы уже выбрали ответ, не забывайте, что этот фрагмент скрипта может завершиться неудачно, если значения 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); } 

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

 foreach($_POST['quantity'] as $key=>$quantity) { $product_no=$_POST['product_id'][$key]; echo $product_no; echo $quantity; }