我正在尝试使用复选框表单提交多个数组,但我目前只能提交一个数组,这是我到目前为止所拥有的
在这个例子中,我提交了一个带数组的数字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>";
}
Run Code Online (Sandbox Code Playgroud)
示例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>
Run Code Online (Sandbox Code Playgroud)
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>";
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想要的只是基本上能够将两个数组传递给我的PHP脚本
电流输出
100001
100002
100003
Run Code Online (Sandbox Code Playgroud)
期望的输出
100001 good
100002 new
100003 new
Run Code Online (Sandbox Code Playgroud)
Dav*_*dom 30
我怀疑,你遇到的问题是,只有被检查的复选框才会被传递回服务器,而所有隐藏的字段将始终传递,因此数组的长度将不同,键也不会对应.
解决方案实际上相对简单 - 您只需指定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>
Run Code Online (Sandbox Code Playgroud)
PHP:
foreach ($_POST['delete'] as $delete) {
$condition = $_POST['condition'][$delete];
// Do stuff
}
Run Code Online (Sandbox Code Playgroud)
这会将$_POST['condition']
数组中的值与数组联系起来,$_POST['delete']
以便所有内容再次匹配.
编辑
上面创建密钥的方式并不好,回想起来,这是错误的方法.
为了演示正确的方法,让我们假设我们有以下数组,简单明了:
$books = array(
10001 => 'good',
10002 => 'new',
10003 => 'new',
10004 => 'good'
);
Run Code Online (Sandbox Code Playgroud)
我们需要做的是占用与每本书相关的两个输入,这意味着我们需要一组可以匹配的键/值对.这听起来像是一个阵列给我.但与上面的示例不同,密钥应该与数据无关 - 它们不需要任何意义,因为我们想要的只是数据.
我们需要做的是明确指定每个单独的键(没有堆栈样式的数组推送),并使密钥与它们相关的数据不可知.
我们做得到:
$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++;
}
Run Code Online (Sandbox Code Playgroud)
...然后,在提交表单时,我们可以这样做:
// 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
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
67248 次 |
最近记录: |