【问题标题】:Foreach loop with multiple arrays具有多个数组的 Foreach 循环
【发布时间】:2010-08-03 16:33:00
【问题描述】:

这就是我想要的:


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 个数组,而无需对数据进行两次 sed。

编辑

  • 这两个数组将始终具有相同的大小
  • 在 mysql_query 中,我将拥有其他元素,而不仅仅是 row、row2,这些元素将是静态的,没有任何数组。

【问题讨论】:

  • 我不明白您如何将数据发送两次。如果您在foreach 中添加echo,您能否显示一些示例输出?

标签: php arrays loops foreach


【解决方案1】:

你的意思是这样的:

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

【讨论】:

  • 如果 $_POSTminimal reproducible example 的值多于 $_POST[something] 那么一些值将会丢失
  • 我正试图根据他关于将数据发送到数据库两次的评论来准确解释 OP 的要求。我怀疑这就是他的意思,但很难解释
  • 嗯,这行得通,但是我收到一个错误:Warning: Invalid argument supplied for foreach() in example.php on line 63 但我完全按照你写的方式使用。
  • 嘿,那是另外一回事,我读错了一行 :D 非常感谢,这正是我想要的 ;)
  • 请记住在插入数据之前先转义,正如其他人所建议的那样
【解决方案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/>";
}
?>

【讨论】:

  • 你为什么要在每篇类似的帖子上发布相同的答案?一个就够了……
【解决方案3】:

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

一种解决方案可能是:

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

【讨论】:

    【解决方案4】:

    我认为最好的方法是作为单个循环来构建查询。即使您的数组长度不同,这也应该有效:

    $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】:
      $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() 函数来检查以确保它们包含一个值。

      编辑

      这当然是假设您不希望“某物”遍历所有“示例”值并分配给每个值。如果你想要那么好,那就有点改变了。

      增加了插入数组测试,如果没有元素不需要更新。谢谢秋葵。

      【讨论】:

      • 你应该测试$insertArr是否有元素。
      • @premiso:为什么不简单地将条件$cnt &gt; 0 添加到$cnt == $cnt2
      • :) 因为这是一个漫长的早晨!
      • 嘿,感谢@permiso 的回答,看起来不错,但是,除了somethingexample 之外,我应该如何将其他元素放在mysql_query 中,我想在他们面前放一个@987654329 @ 也。我正在尝试这样的事情但不起作用:| $query = "INSERT INTO table (id, something, example) VALUES " ."({$id}, ". implode(", ", $insertArr). ")";
      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        具有多个数组的 Foreach 循环:

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

        【讨论】:

          猜你喜欢
          • 2014-10-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-10
          • 2021-05-21
          • 1970-01-01
          • 2015-06-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多