19

チェックボックスフォームを使用して複数のアレイを送信しようとしていますが、現時点では1つのアレイしか送信できません。これまでのところ、次のようになっています。

この例では、配列とともに数値の配列を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>";
      }

   }
}

私が欲しいのは基本的に2つの配列を私のphpスクリプトに渡すことができることです

現在の出力

100001
100002
100003

希望する出力

100001   good
100002   new
100003   new
4

3 に答える 3

36

あなたが抱えている問題は、チェックされたチェックボックスだけがサーバーに戻されるのに対し、すべての非表示フィールドは常に渡されるため、配列の長さが異なり、キーが対応しないことです。

これに対する解決策は実際には比較的単純です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'
);

私たちがする必要があるのは、各本に関連付けられている2つの入力を結び付けることです。つまり、一致させることができるキーと値のペアのセットが必要です。それは私には配列のように聞こえます。ただし、上記の例とは異なり、キーはデータとは無関係である必要があります。必要なのはデータだけなので、キーは何も意味する必要はありません。

私たちがする必要があるのは、すべてのキーを明示的に指定し(スタックスタイルの配列をプッシュしない)、キーが関連するデータに依存しないようにすることです。

できるよ:

$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
}
于 2012-08-05T22:45:16.910 に答える
3

私はあなたが何を求めているかについて少し混乱していますが、私はあなたのためにこれを単純化できると思います。非表示フィールドの値をどのように生成しているかわかりませんが、ハードコーディングされていますか?とにかく、このシステムは単純化されていればはるかにうまく機能するでしょう。

これを試してみてください...

これにより、番号と条件の情報が結合され、処理のためにバックエンドで分割されます。このようにして、情報は同時に渡されます。

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


    ?>

繰り返しになりますが、これが役に立ったかどうかはわかりません。あなたが何を達成しようとしているのかについて少し誤解していたからですが、お役に立てば幸いです。

于 2012-08-05T22:54:25.763 に答える
1

複数の非表示フィールドを配列としてPHPハンドラーに渡すか、そのデータの収集方法を変更するための独創的な方法を見つける必要があります。「シリアル化された」アレイが最善の策のようです。

このStackOverflowの回答は、実際にできることの概要を示しており、スクリプトの動作と一致している必要があります。幸運を!

于 2012-08-05T22:38:57.863 に答える