PHP-获取已签入复选框的所有值,并将其合并到一个数组中
我在从HTML表单获取值方面没有问题,但我的问题是如何将我获得的所有值组合到一个数组中 示例:PHP-获取已签入复选框的所有值,并将其合并到一个数组中,php,arrays,associative-array,Php,Arrays,Associative Array,我在从HTML表单获取值方面没有问题,但我的问题是如何将我获得的所有值组合到一个数组中 示例: 数量[]与复选框[]分开。如果选中该复选框,则只应将其所有值(比萨饼ID、名称、价格和数量)传输到一个数组中 代码片段: <tbody> <?php $Row = 0; while ($Row = mysqli_fetch_array($Retrieval_Query, MYSQLI_ASSOC)){ $pizzaID = $Row['pi
数量[]
与复选框[]
分开。如果选中该复选框,则只应将其所有值(比萨饼ID、名称、价格和数量)传输到一个数组中
代码片段:
<tbody>
<?php
$Row = 0;
while ($Row = mysqli_fetch_array($Retrieval_Query, MYSQLI_ASSOC)){
$pizzaID = $Row['pizzaID'];
$pizzaName = $Row['pizzaName'];
$pizzaPrice = $Row['pizzaPrice'];
?>
<tr>
<td><?php echo $pizzaID; ?></td>
<td><?php echo $pizzaName; ?> </td>
<td><?php echo $pizzaPrice; ?> </td>
<td><input type = "number" name = "Quantities[]" placeholder = "0"/></td>
<td><input type = "checkbox" name = "CheckBox[]" value="<?=$pizzaID?>,<?=$pizzaName?>,<?=$pizzaPrice?>" placeholder = "0"/></td>
</tr>
<?php } ?>
</tbody>
</table>
</form>
<button type="submit" form="form1" value="Atc" name="atc" class="btn btn-warning">Add to Cart</button>
在这里,您的复选框数组索引与数量索引不同,因此bcz必须更改代码的方式:
单击复选框时,您必须将cat数量与复选框值相匹配,如:
$(document).on('click','input[name=checkBoxName]',function()
{
if($(this).is(":checked")) //check if checkbox checked
{
var key = $(this).attr('data-cnt');
var qty = $("#qty"+key).val(); //return qty id value like qty1
$(this).val($(this).val()+','+qty);
}
else //check box not checked then remove last qty value
{
var text = $(this).val();
var resArray = text.split(",");
var poppedItem = resArray.pop();
var result = resArray.toString();
$(this).val(result);
}
});
在while循环之前声明cnt=0
while()
{?>
<input type = "number" name = "Quantities[]" id="qty<?php echo $cnt?>" placeholder = "0"/>
<input type = "checkbox" name = "CheckBox[]" data-cnt="<?php echo $cnt?>" value="<?=$pizzaID?>,<?=$pizzaName?>,<?=$pizzaPrice?>" placeholder = "0"/>
<?php }
您将获得预期的输出。这里,您的复选框数组索引与数量索引不同,因此bcz必须更改代码的方式:
$values = array();
$quantities = array();
foreach($_POST['CheckBox'] as $key => $value){
array_push($values, $value);
}
$quantities = $_POST['Quantities'];
$i=0;
foreach ($quantities as $q){
if($q){
$values[$i] = $values[$i].','.$q;
$i++;
}
}
单击复选框时,您必须将cat数量与复选框值相匹配,如:
$(document).on('click','input[name=checkBoxName]',function()
{
if($(this).is(":checked")) //check if checkbox checked
{
var key = $(this).attr('data-cnt');
var qty = $("#qty"+key).val(); //return qty id value like qty1
$(this).val($(this).val()+','+qty);
}
else //check box not checked then remove last qty value
{
var text = $(this).val();
var resArray = text.split(",");
var poppedItem = resArray.pop();
var result = resArray.toString();
$(this).val(result);
}
});
在while循环之前声明cnt=0
while()
{?>
<input type = "number" name = "Quantities[]" id="qty<?php echo $cnt?>" placeholder = "0"/>
<input type = "checkbox" name = "CheckBox[]" data-cnt="<?php echo $cnt?>" value="<?=$pizzaID?>,<?=$pizzaName?>,<?=$pizzaPrice?>" placeholder = "0"/>
<?php }
您将获得预期的输出
$values = array();
$quantities = array();
foreach($_POST['CheckBox'] as $key => $value){
array_push($values, $value);
}
$quantities = $_POST['Quantities'];
$i=0;
foreach ($quantities as $q){
if($q){
$values[$i] = $values[$i].','.$q;
$i++;
}
}
下面是我的输出
排列
(
[0]=>1,哈瓦,150,23
[1] =>3,4,300,33
)
下面是我的输出
排列
(
[0]=>1,哈瓦,150,23
[1] =>3,4,300,33
)如果按照PHP在脚本中看到的方式查看发布的数据,您将更好地了解正在发生的事情。在PHP的顶部添加:
print_r($_POST);
die();
你会看到:
Array
(
[Quantities] => Array
(
[0] => 23
[1] =>
[2] => 33
)
[CheckBox] => Array
(
[0] => 1,Hawaiian,150
[1] => 3,Four Cheese,300
)
接下来,只需将元素附加到数组的末尾。因此,您只是将这两个数组一个接一个地连接起来,而不保留元素相互关联的事实
下一个问题是,如果未选中复选框,则在发布的数据中根本不会出现复选框。您可以看到,在复选框数组中只有2个元素,即使表单中有5个比萨饼。这意味着您不能使用键连接数量
数组和复选框
数组中的元素。数量
中的键1对应于培根和奶酪
,但复选框
中的键1对应于四个奶酪
我认为用你目前的方法解决这个问题并不容易
但是退一步,你真的想把价格贴到你的处理代码上吗?如果我在浏览器中编辑表单并将价格设置为“1”或“0”,该怎么办?您永远不应该信任来自浏览器的数据,而且您的数据库中已经有这些数据
如果数量为0,你真的在乎订单中的比萨饼吗?您可以取消该复选框,因为在“数量”字段中输入一个数字可以控制他们是否得到该比萨饼
以下是另一种方法:
<?php while ($Row = mysqli_fetch_array($Retrieval_Query, MYSQLI_ASSOC)) { ?>
<tr>
<td><?php echo $Row['pizzaID']; ?></td>
<td><?php echo $Row['pizzaName']; ?></td>
<td><?php echo $Row['pizzaPrice']; ?></td>
<td>
<!-- include the ids, we can refer to those for each quantity -->
<input type="hidden" name="ids[]" value="<?php echo $Row['pizzaID']; ?>"/>
<input type="number" name="Quantities[]" placeholder = "0"/>
</td>
</tr>
<?php } ?>
旁注-这可能只是真实代码和问题之间的复制粘贴问题,但提交按钮应该位于
标记内。如果您按照PHP在脚本中看到的方式查看发布的数据,您将更好地了解发生了什么。在PHP的顶部添加:
print_r($_POST);
die();
你会看到:
Array
(
[Quantities] => Array
(
[0] => 23
[1] =>
[2] => 33
)
[CheckBox] => Array
(
[0] => 1,Hawaiian,150
[1] => 3,Four Cheese,300
)
接下来,只需将元素附加到数组的末尾。因此,您只是将这两个数组一个接一个地连接起来,而不保留元素相互关联的事实
下一个问题是,如果未选中复选框,则在发布的数据中根本不会出现复选框。您可以看到,在复选框数组中只有2个元素,即使表单中有5个比萨饼。这意味着您不能使用键连接数量
数组和复选框
数组中的元素。数量
中的键1对应于培根和奶酪
,但复选框
中的键1对应于四个奶酪
我认为用你目前的方法解决这个问题并不容易
但是退一步,你真的想把价格贴到你的处理代码上吗?如果我在浏览器中编辑表单并将价格设置为“1”或“0”,该怎么办?您永远不应该信任来自浏览器的数据,而且您的数据库中已经有这些数据
如果数量为0,你真的在乎订单中的比萨饼吗?您可以取消该复选框,因为在“数量”字段中输入一个数字可以控制他们是否得到该比萨饼
以下是另一种方法:
<?php while ($Row = mysqli_fetch_array($Retrieval_Query, MYSQLI_ASSOC)) { ?>
<tr>
<td><?php echo $Row['pizzaID']; ?></td>
<td><?php echo $Row['pizzaName']; ?></td>
<td><?php echo $Row['pizzaPrice']; ?></td>
<td>
<!-- include the ids, we can refer to those for each quantity -->
<input type="hidden" name="ids[]" value="<?php echo $Row['pizzaID']; ?>"/>
<input type="number" name="Quantities[]" placeholder = "0"/>
</td>
</tr>
<?php } ?>
旁注-可能只是真实代码和问题之间的复制粘贴问题,但提交按钮应位于
标记内。您可以使用“关联数组”样式命名表单输入,如PHP文档中所述:
使用您独特的pizzaID
作为两个输入阵列的键:
(包括一个字符串元素(我在这里使用了id\uu
),以确保它是一个字符串键,稍后我们将使用它,因为数组函数对数字索引数组的工作方式不同)
这将组合与每个pizzaId
键关联的所有值。生成的数组如下所示:
Array
(
[id_1] => Array
(
[0] => 1,Hawaiian,150
[1] => 23
)
[id_3] => Array
(
[0] => 3,Four Cheese,300
[1] => 33
)
)
现在,您可以挤压这些合并的数组,为每个pizzaId生成一个逗号分隔的列表:
$squashed = array_map(function($v){
return is_array($v)
? implode(',', $v)
: $v;
}, $merged);
$squashed
数组现在将包含:
Array
(
[id_1] => 1,Hawaiian,150,23
[id_3] => 3,Four Cheese,300,33
)
然后,如果需要,可以从键中去掉id
前缀
一个警告是,如果用户只提交了两个输入字段中的一个字段的值,那么结果数组将只包含该单个值,需要进一步分析以确定这是数量
还是复选框
值(例如,对照is_int()
可以确定值是否属于数量)。可以使用“关联数组”样式命名表单输入,如PHP文档中所述:
使用您独特的pizzaID
作为两个输入阵列的键:
(包括一个字符串元素(我使用了id\uu