2012-08-05 10 views
11

ich mehrere Arrays mit einer Checkbox Formular abzuschicken bin versucht, aber ich bin nur in der Lage ein Array zur Zeit vorlegen, hier ist das, was ichWie mehrere Array Checkbox mit HTML-Formulare einreichen

In diesem Beispiel bisher haben Ich reiche ein Array von Zahlen mit dem delete[] Array, dieses Array wird ordnungsgemäß verarbeitet, ich möchte auch das Array senden condition[] das wird nicht richtig verarbeitet, was ist der beste Weg, um dieses Problem zu lösen?

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

Beispiel 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-Funktion

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

    } 
} 

Alles, was ich will ich s grundsätzlich in der Lage sein, passieren zwei Arrays zu meinem PHP-Skript

Stromausgang

100001 
100002 
100003 

gewünschter Ausgang

100001 good 
100002 new 
100003 new 
+0

Ich bin verwirrt, was Sie fragen. Ich sehe '$ _POST ['condition']' nirgends in Ihrem Code, daher bin ich mir nicht sicher, wonach Sie fragen. – David

+1

Ich bin mir nicht sicher [] Trick gilt auch für versteckte Felder .. – favoretti

+0

@David Ich versuche, die ['Bedingung'] zu arbeiten, z. 'foreach ($ _ POST ['condition'] als $ checkbox) echo $ checkbox."
"; aber das funktioniert nicht –

Antwort

22

Das Problem, das Sie haben, vermute ich, ist, dass nur die Checkboxen, die überprüft werden, an den Server zurückgegeben werden, während alle die versteckten Felder immer übergeben werden, so dass die Längen der Arrays abweichen und Die Schlüssel werden nicht übereinstimmen.

Die Lösung dafür ist eigentlich relativ einfach - Sie müssen nur die Schlüssel für die condition-Array angeben, damit Sie die Werte wieder übereinstimmen können. Etwas wie folgt aus:

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 
} 

Dies bindet die Werte in der $_POST['condition'] Array zurück nach oben mit dem $_POST['delete'] Array so wieder alles zusammenpassen wird.

EDIT

Die Art und Weise die Tasten oben erstellt werden, ist nicht groß und im Nachhinein ist es der falsche Weg, es zu tun.

die rechts Weise zu demonstrieren, es zu tun, lassen Sie uns vorstellen, haben wir die folgende Array, schön und einfach:

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

Was wir tun müssen, ist, die beiden Eingänge zu binden, die mit jedem verbunden sind Buch, was bedeutet, dass wir eine Reihe von Schlüssel/Wert-Paaren benötigen, die aufeinander abgestimmt werden können. Das klingt für mich nach einem Array. Aber anders als im obigen Beispiel sollten die Schlüssel für die Daten irrelevant sein - sie müssen nichts bedeuten, denn alles, was wir wollen, sind die Daten.

Was wir tun müssen, ist, jeden einzelnen Schlüssel explizit anzugeben (kein stack-array) und die Schlüssel unabhängig von den Daten zu machen, auf die sie sich beziehen.

Wir können dies tun:

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

... und dann, wenn das Formular abgeschickt wird, können wir dies tun:

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

das sieht interessant aus, ich gebe es einen Schuss –

+0

das ist großartig ist genau und sehr gut gearbeitet . danke –

+0

Ich bin auf ein Problem mit Ihrer Lösung gestoßen, was mache ich, wenn es 2 Bücher mit der gleichen ISBN aber unterschiedlichen Bedingungen gibt, habe ich ein paar inkonsistente Ergebnisse bekommen. –

1

Sie gehen zu müssen, eine kreative Art und Weise finden um mehrere versteckte Felder als ein Array an den PHP-Handler zu übergeben, oder um zu ändern, wie diese Daten gesammelt werden. Ein "serialisiertes" Array scheint die beste Wahl zu sein.

This StackOverflow answer beschreibt wirklich, was Sie tun können, und sollte immer noch das Verhalten Ihres Skripts entsprechen. Viel Glück!

+0

Ich gucke –

1

Ich bin ein wenig verwirrt darüber, was du bist fragend, aber ich denke, dass ich das für dich vereinfachen kann. Ich weiß nicht, wie Sie die Werte für die versteckten Felder generieren, sind sie fest codiert? Unabhängig davon würde dieses System viel besser funktionieren, wenn es vereinfacht würde.

dies ausprobieren ....

Dies wird die Informationen für die Zahlen und den Zustand verbindet, dann wird es sie auf dem Backend für die Handhabung aufgeteilt. Auf diese Weise werden die Informationen zur gleichen Zeit weitergegeben.

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


    ?> 

Noch einmal, ich weiß nicht, ob dies hilfreich ist oder nicht, weil ich ein wenig falsch verstanden darüber, was genau Sie erreichen wollten, aber ich hoffe, es war hilfreich.

+1

Mach dir keine Sorgen, es wurde schon beantwortet, aber danke für deine Eingabe –

Verwandte Themen