我正在尝试使用复选框表单提交多个数组,但我目前只能提交一个数组,这是我到目前为止所拥有的
在这个例子中,我提交了一个带有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 </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
答案 0 :(得分:28)
我怀疑,您遇到的问题是,只有选中的复选框才会传回服务器,而 all 隐藏字段将始终传递给所有长度的数组会有所不同,键也不会对应。
解决方法实际上相对简单 - 您只需指定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
}
答案 1 :(得分:2)
我对你的要求有点困惑,但我想我可以为你简化这个。我不知道你是如何生成隐藏字段的值,它们是硬编码的吗?无论如何,如果简化它,这个系统会更好。
试试这个......
这将结合数字和条件的信息,然后将它们分割在后端进行处理。这样就可以同时传递信息。
<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";
}
}
?>
同样,我不知道这是否有用,因为我对你想要达到的目标有点误解,但我希望它有所帮助。
答案 2 :(得分:1)
您必须找到一种创造性的方法,将多个隐藏字段作为数组传递给PHP处理程序,或者更改数据的收集方式。 A&#34;序列化&#34;数组似乎是最好的选择。
This StackOverflow answer确实概述了您可以执行的操作,并且仍应符合您脚本的行为。祝你好运!