如何提交HTML表单多阵列复选框(How to submit multiple array chec

2019-06-26 18:51发布

我想有一个复选框表单提交多个阵列,但我只能在此刻提交一个数组,这里是我迄今为止

在这个例子中,我提交的数字阵列与delete[]数组,这个数组被妥善处理,我也想提交阵列condition[]这并没有得到妥善处理,什么是解决这一问题的最佳方法是什么?

PHP代码

$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>\n";


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

例如HTML标记

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

   }
}

所有我想要的是基本能够两个数组传递给我的PHP脚本

电流输出

100001
100002
100003

期望的输出

100001   good
100002   new
100003   new

Answer 1:

那你有,我怀疑,问题是,只有那些选中的复选框将被传递回服务器,而所有的隐藏字段将始终通过这样的数组的长度会有所不同,按键不会一致。

这个问题的解决其实比较简单-你只需要到指定的键condition数组,以便您可以再次匹配值了。 事情是这样的:

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
}

这将在为结值$_POST['condition']数组,备份与$_POST['delete']数组所以一切都将重新匹配。

编辑

按键被上面创建的方式是不是伟大,回想起来是错误的方式来做到这一点。

为了证明这样做的正确的路,让我们想象一下,我们有以下的阵列,优雅而简单:

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

我们需要做的是占用与每个书,这意味着我们需要一套能够匹配了键/值对相关的两个输入。 这听起来像一个数组给我。 但是,与上面的例子中,钥匙应该是无关的数据 - 他们不需要任何意义,因为我们想要的数据。

我们需要做的是明确指定每一个键(无堆叠式阵列推),使键无关,他们涉及到的数据。

我们做得到:

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

......然后,在提交表单的时候,我们可以这样做:

// 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
}


Answer 2:

我有点困惑,你问什么,但我想我可以简化这个给你。 我不知道你是如何生成的隐藏字段的值,被他们硬编码? 无论如何,这个系统将工作,如果它被简化好得多。

尝试了这一点....

本文将结合信息的数量和条件,那么将它们分割在后端进行处理。 这样的信息在同一时间通过。

<tr>
         <td>
            <input type='checkbox' name='delete[]' value='100001-good' />
         </td>
      </tr>

      <tr>
         <td>
            <input type='checkbox' name='delete[]' value='100002-new' />
         </td>
      </tr>

      <tr>
         <td>
            <input type='checkbox' name='delete[]' value='100003-new' />
         </td>
      </tr>

    <?php


       if(isset($_POST['deleteInventoryBook'])){
          if(isset($_POST['delete']) && is_array($_POST['delete'])){
             foreach($_POST['delete'] as $checkbox){
               $checkbox = explode('-', $checkbox);
               echo $checkbox[1];
               echo '<br />';
               echo $checkbox[0];
               echo '<br />';
             }
          }else{
             echo "No values have been set";
          }
       }


    ?>

同样,我不知道这是有益的或不是因为我正要正是你所试图实现一个小误会,但我希望它是有益的。



Answer 3:

你将不得不寻找传递多个隐藏字段作为数组的PHP处理程序,或更改数据的收集方式,创造性地。 A“连载”阵列似乎是最好的选择。

这StackOverflow的答案真的概述你可以做什么,应该还是符合您的脚本的行为。 祝好运!



文章来源: How to submit multiple array checkbox with html forms
标签: php html forms