具有多个数组的Foreach循环

时间:2010-08-03 16:33:00

标签: php arrays loops 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,那些将是静态的,没有任何数组。

7 个答案:

答案 0 :(得分:11)

你的意思是:

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

答案 1 :(得分:2)

多个阵列的解决方案

尝试 -

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

答案 2 :(得分: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);
}

答案 3 :(得分: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()函数进行检查以确保它们包含值。

修改

当然,这是假设您不希望“某事”迭代所有“示例”值并分配给每个值。如果你想要那么好,这有点变化。

如果没有元素不需要更新,则添加插入数组测试。谢谢Gumbo。

答案 4 :(得分: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占位符也会更容易。

答案 5 :(得分: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);
}

答案 6 :(得分:0)

具有多个数组的Foreach循环:

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