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

PHP - Get all values that has been checked in checkbox and combine it in one array

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

示例:

Quantity[]CheckBox[]分开。如果复选框已被选中,则只有它的所有值(比萨 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>

后端:

<?php
$values = array();
$quantities = array();

if(isset($_POST['atc'])){

//Operation to retrieve all values from HTML CheckBox[] and Quantities[] since they are separated inputs
//And push all values that has been retrieved into same array
foreach($_POST['CheckBox'] as $key => $value){
    array_push($values, $value);
}
foreach($_POST['Quantities'] as $key => $value){
    array_push($values, $value);
}

当前输出:

期望的输出:

How to achieve the desired output? Is my technique on getting the values from HTML (2 Separated arrays) is right? How to make all values to be combine in just one array?

此处您的复选框数组索引与数量索引不同,因此您必须更改代码方式:

单击复选框时,您必须将数量与复选框值相结合,例如:

$(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 }

当您 post 数据时,您将得到:

foreach($_POST['CheckBox'] as $key => $value){
    array_push($values, $value);
}

var_dump($values);

您将获得预期的输出。

$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,四,300,33 )

如果您像 PHP 在脚本中看到的那样查看 POSTed 数据,您将更好地理解正在发生的事情。在 PHP 的顶部添加:

print_r($_POST);
die();

你会看到:

Array
(
    [Quantities] => Array
        (
            [0] => 23
            [1] => 
            [2] => 33
        )

    [CheckBox] => Array
        (
            [0] => 1,Hawaiian,150
            [1] => 3,Four Cheese,300
        )

接下来,array_push 只是将元素追加到数组的末尾。所以你只是一个接一个地加入这两个数组,而不保留元素彼此相关的事实。

下一个问题是,如果未选中复选框,则复选框根本不会出现在 POSTed 数据中。您可以看到 Checkbox 数组中只有 2 个元素,即使表单中有 5 个比萨饼。这意味着您无法使用键连接 Quantities 数组和 CheckBox 数组中的元素。 Quantities中的key 1对应Bacon and Cheese,但CheckBox中的key 1对应Four Cheese.

我看不到使用您当前的方法可以轻松解决此问题的方法。

但退一步 - 您真的要 POST 价格到您的处理代码吗?如果我在浏览器中编辑表格并将价格设置为“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 } ?>

现在在您的后端,您可以执行以下操作:

foreach ($_POST['Quantities'] as $key => $value) {

    if (empty($value) || $value == 0) {
        // wasn't ordered!  Skip to the next.
        continue;
    }

    $id = $_POST['ids'][$key];
    // Now you know they want $value of pizza id $id.  You can look
    // up the price, name, etc, from your DB, same as you did to 
    // display them on the form in the first place.
}

旁注 - 它可能只是您的真实代码和您在此处的问题之间的复制粘贴问题,但提交按钮应位于 </form> 标记内。

您可以使用 "associative array" 命名表单输入的样式,如 PHP 文档中所述:

http://www.php.net/manual/en/faq.html.php#faq.html.arrays

使用您唯一的 pizzaID 作为两个输入数组的键:

(包括一个字符串元素(我在这里使用了 id_)以确保它将是我们稍后将使用的字符串键,因为数组函数对于数字索引数组的工作方式不同)

while ($Row = mysqli_fetch_array($Retrieval_Query, MYSQLI_ASSOC))
{?>
  <input type = "number" name = "Quantities[id_<?=$pizzaID?>]" id="qty<?php echo $cnt?>" placeholder = "0"/>
  <input type = "checkbox" name = "CheckBox[id_<?=$pizzaID?>]" data-cnt="<?php echo $cnt?>" value="<?=$pizzaID?>,<?=$pizzaName?>,<?=$pizzaPrice?>" placeholder = "0"/>
<?php }

当您读取 POST 中的值时,每个命名数组将采用 key => [id => value].

的格式

然后您可以使用 id 键字符串通过 array_merge_recursive 统一 2 个数组中的值。

$q = $_POST['Quantities'] ?? [];
$c = $_POST['CheckBox'] ?? [];
$merged = array_merge_recursive($q, $c);

这将合并与每个 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_ 前缀可以从键中删除。

需要注意的是,如果用户仅提交了 2 个输入字段中的 一个 的值,则生成的数组将仅包含该单个值,并且需要进一步分析以确定这是 Quantity 还是 Checkbox 值(例如,检查 is_int() 可以确定该值是否属于数量)。