2012-08-05 90 views
11

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

在这个例子中我正在提交一组数字与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>"; 
     } 

    } 
} 

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

电流输出

100001 
100002 
100003 

所需的输出

100001 good 
100002 new 
100003 new 
+0

我很困惑你在问什么。我在代码中的任何地方都看不到'$ _POST ['condition'],所以我不确定你在问什么。 – David 2012-08-05 22:34:09

+1

我不确定[]技巧是否适用于隐藏字段.. – favoretti 2012-08-05 22:35:13

+0

@大卫即时尝试让['条件']工作,例如, '的foreach($ _ POST [“条件”]为$复选框)回声$勾选“
”;'但不起作用 – 2012-08-05 22:36:18

回答

22

的问题,您有,我怀疑,是唯一被选中将被传递回服务器复选框,而所有隐藏字段将始终通过这样的数组的长度会有所不同,钥匙不会对应。

对此的解决方案实际上相对简单 - 您只需指定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 
} 
+0

这看起来很有趣,我会给它一个镜头 – 2012-08-05 22:47:28

+0

这是伟大的工作准确,非常好。感谢 – 2012-08-05 22:50:26

+0

我与您的解决方案遇到了问题,我该怎么办,如果有两本书具有相同ISBN但不同的条件下,我已经得到一些不一致的结果。 – 2012-08-06 21:38:34

1

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

This StackOverflow answer确实概括了你可以做什么,并且应该仍然符合你的脚本的行为。祝你好运!

+0

我会看看 – 2012-08-05 22:41:07

1

我有点困惑,你是什么问,但我想我可以为你简化这一点。我不知道你是如何生成隐藏字段的值,它们是硬编码的吗?无论如何,如果简化,这个系统将会更好。

尝试了这一点....

本文将结合了数字和条件的信息,然后将它们分割在后端进行处理。这样信息就可以同时传递。

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


    ?> 

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

+1

不用担心它已被回答,但感谢您的输入 – 2012-08-05 22:55:24