Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-获取已签入复选框的所有值,并将其合并到一个数组中_Php_Arrays_Associative Array - Fatal编程技术网

PHP-获取已签入复选框的所有值,并将其合并到一个数组中

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

我在从HTML表单获取值方面没有问题,但我的问题是如何将我获得的所有值组合到一个数组中

示例:

数量[]
复选框[]
分开。如果选中该复选框,则只应将其所有值(比萨饼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