Как установить флажок с несколькими массивами с форматами html
Я пытаюсь представить несколько массивов с помощью формы флажка, но я могу только представить один массив в данный момент, вот что я до сих пор
В этом примере я представляю массив чисел с массивом delete[]
, этот массив обрабатывается должным образом, я также хочу представить condition[]
массива 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 </th>
<th>Rank </th>
<th>Condition </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
Ответы
Ответ 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
}
Ответ 2
Вам нужно будет найти творческий способ передать несколько скрытых полей в виде массива обработчику PHP или изменить способ сбора этих данных. Кажется, что это "сериализованный" массив.
fooobar.com/questions/269049/... действительно описывает, что вы можете сделать, и должен по-прежнему соответствовать вашему сценарию. Удачи!
Ответ 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";
}
}
?>
Опять же, я не знаю, полезно ли это или нет, потому что я немного неправильно понял, чего именно вы пытаетесь достичь, но я надеюсь, что это было полезно.