dtra49684 2012-08-05 22:30
浏览 160
已采纳

如何使用html表单提交多个数组复选框

I am trying to submit multiple arrays with a checkbox form but I am only able to submit one array at the moment, here is what I have so far

In this example I am submitting an array of numbers with the delete[] array, this array gets processed properly, I also want to submit the array condition[] this does not get processed properly, what is the best way to solve this issue?

php code

$catalog = $database->getInventory();

if($catalog){   
   $numRows = sizeof($catalog);//count
   echo "<b>Book Count:</b> ".$numRows."<br>";

   echo "<form method='post' action='inventory.php'>";
   echo "<table id='example' class='tablesorter' border='0' cellpadding='0' cellspacing='1'>";
   echo "
      <thead>
         <tr>
           <th>ISBN</th>        
           <th>Title&nbsp;&nbsp;&nbsp;</th>
           <th>Rank&nbsp;&nbsp;</th>
           <th>Condition&nbsp;&nbsp;</th>   
           <th><input type='checkbox' name='delete' value='all' /></th>
         </tr>
      </thead>
";


   foreach($catalog as $elem){
      echo "
         <tr>
            <td>".$elem["isbn"]."</td>
            <td>".$elem["title"]."</td>
            <td>".$elem["rank"]."</td>
            <td>".$elem["condition"]."</td>
            <td> 
               <input type='checkbox' name='add[]' 
                  value='".$elem['isbn']."_".$elem['condition']."_"."' />
            </td>
         </tr>";    
   }

   echo "</table>";
   echo "</form>";
}

example html markup

<form method='post' action='inventory.php'>
   <table>
      <tr>
         <td>
            <input type='hidden' name='addInventoryBook' value='1'>
            <input type='submit' value='Add' />
         </td>
      </tr>

      <tr>
         <td>
            <input type='checkbox' name='add[]' value='100001_used' />
         </td>
      </tr>

      <tr>
         <td>
            <input type='checkbox' name='add[]' value='100001_new' />
         </td>
      </tr>

      <tr>
         <td>
            <input type='checkbox' name='add[]' value='100003_new' />
         </td>
      </tr>

   </table>
</form>

php function

function Inventory(){   
   if(isset($_POST['addInventoryBook'])){
      if(isset($_POST['add']) && is_array($_POST['add'])){
     $arr = array();
         foreach($_POST['add'] as $checkbox){
            $temp = explode("_", $checkbox);

            $arr[] = array(
               "isbn"       => $temp[0],
               "condition"      => $temp[1],
               "sub_condition"  => $temp[2]
            );
         }              
     $this->addInventoryBook($arr); 
      }

      else{
         echo "No values have been set";
      }
 }


function addInventoryBook($arr){
   foreach($arr as $elem){
      //if used get sub-category
      if($elem['condition']=='used'){
         echo $elem['isbn']."-".ucfirst($elem['condition'])
            .ucfirst($elem['sub_condition'])."<br>";
      }

      else if($elem['condition']=='new'){
         echo $elem['isbn']."-".ucfirst($elem['condition'])."<br>";
      }

   }
}

All I want is to basically be able to pass two arrays to my php script

current output

100001
100002
100003

desired output

100001   good
100002   new
100003   new
  • 写回答

3条回答 默认 最新

  • drnpwmq4536 2012-08-05 22:45
    关注

    The problem that you are having, I suspect, is that only the checkboxes that are checked will be passed back to the server, whereas all the hidden fields will always be passed so the lengths of the arrays will differ and the keys wont correspond.

    The solution to this is actually relatively simple - you just need to specify the keys for the condition array so you can match the values up again. Something like this:

    HTML:

      <tr>
         <td>
            <input type='hidden' name='condition[100001]' value='good' />
            <input type='checkbox' name='delete[]' value='100001' />
         </td>
      </tr>
    
      <tr>
         <td>
            <input type='hidden' name='condition[100002]' value='new' />
            <input type='checkbox' name='delete[]' value='100002' />
         </td>
      </tr>
    

    PHP:

    foreach ($_POST['delete'] as $delete) {
      $condition = $_POST['condition'][$delete];
      // Do stuff
    }
    

    This ties the values in the $_POST['condition'] array back up with the $_POST['delete'] array so everything will match up again.

    EDIT

    The way the keys are being created above is not great and in retrospect it is the wrong way to do it.

    To demonstrate the right way to do it, let's imagine we have the following array, nice and simple:

    $books = array(
      10001 => 'good',
      10002 => 'new',
      10003 => 'new',
      10004 => 'good'
    );
    

    What we need to do is tie up the two inputs that are associated with each book, which means we need a set of key/value pairs that can be matched up. That sounds like an array to me. But unlike the example above, the keys should be irrelevant to the data - they don't need to mean anything, because all we want is the data.

    What we need to do is specify every single key explicitly (no stack-style array pushes) and make the keys agnostic of the data they relate to.

    We can do this:

    $i = 0;
    foreach ($books as $isbn => $condition) {
      echo "
        <tr>
          <td>
            <input type='hidden' name='condition[$i]' value='$condition' />
            <input type='checkbox' name='delete[$i]' value='$isbn' />
          </td>
        </tr>
      ";
      $i++;
    }
    

    ...and then, when the form is submitted, we can do this:

    // We still base our code on $_POST['delete'] - because this is the array that
    // depends on the user input. This time, though, we'll look at the keys as well
    foreach ($_POST['delete'] as $key => $isbn) {
      $condition = $_POST['condition'][$key];
      // Do stuff
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法