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行,而这些将是静态的,没有任何阵列。
你的意思是这样的:
foreach($_POST['something'] as $key => $something) {
$example = $_POST['example'][$key];
$query = mysql_query("INSERT INTO table (row, row2) VALUES ('{$something}','{$example}')");
}
您的解决方案似乎没有发送两次数据。除非由于发出查询而出现具有相同值的记录。这可能意味着你应该在构建查询之前处理你的数据。
一种解决方案可以是:
$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。
我认为最好的办法是为单回路构建查询。即使您的阵列长度不一样,也应该可以工作:
$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/>";
}
?>
你为什么发布相同的答案每一个像这样的职位?只有一个就足够了...... – j0k 2013-03-28 10:26:05
第一个解决方案已经为我工作。谢谢 :) – 2014-03-14 08:25:26
多个Foreach循环阵列:
foreach($_POST['quantity'] as $key=>$quantity)
{
$product_no=$_POST['product_id'][$key];
echo $product_no;
echo $quantity;
}
我不明白你是如何发送数据两次。如果你在'foreach'中加入'echo',你能显示一些示例输出吗? – KLee1 2010-08-03 16:36:34