Foreach循环与多个阵列

问题描述:

这就是我想要的东西: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我会有其他元素不只是行,2行,而这些将是静态的,没有任何阵列。
+1

我不明白你是如何发送数据两次。如果你在'foreach'中加入'echo',你能显示一些示例输出吗? – KLee1 2010-08-03 16:36:34

你的意思是这样的:

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

如果$ _POST [示例]具有比$ _POST [something]更多的值,那么其中一些值将丢失 – Cfreak 2010-08-03 16:45:17

+0

我试图根据他向数据库发送数据的意见,准确解释OP要求的内容。我的怀疑是这就是他的意思,但是难以解释 – 2010-08-03 16:49:23

+1

嗯,这个工作,但是我得到一个错误:'警告:提供的foreach()在63行的example.php中的无效参数,但我确切地使用你写了。 – Adam 2010-08-03 17:24:14

您的解决方案似乎没有发送两次数据。除非由于发出查询而出现具有相同值的记录。这可能意味着你应该在构建查询之前处理你的数据。

一种解决方案可以是:

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

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

+1

您应该测试'$ insertArr'确实是否有元素。 – Gumbo 2010-08-03 16:44:30

+0

是的,很好的电话。在if语句中添加。 – 2010-08-03 16:46:13

+0

@premiso:为什么不简单地将条件'$ cnt> 0'添加到'$ cnt == $ cnt2'? – Gumbo 2010-08-03 16:51:00

我认为最好的办法是为单回路构建查询。即使您的阵列长度不一样,也应该可以工作:

$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中使用占位符也会更容易。

尽管您已经选择了答案,但如果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); 
} 

解多个阵列

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 2013-03-28 10:26:05

+0

第一个解决方案已经为我工作。谢谢 :) – 2014-03-14 08:25:26

多个Foreach循环阵列:

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