2012-08-05 74 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