我目前正在使用PHP构建自定义购物车。
每个可以添加到购物车的产品都有2个变量,pid用于数据库中的产品ID,并且用于唯一的设计ID。我的所有产品都是定制的,因此这些是我需要的两个主要变量。
当用户将项目添加到空白购物车时,$ _SESSION将使用名为cart_array的多维数组进行制作。当添加相同的项目时,我可以在cart_array中搜索匹配的键值对并增加数量而不是添加新数组。但是,我只能匹配1对值。我需要找到一个具有一个键值对的数组(pid =已发布的pid),然后查看是否在同一个数组中有另一个匹配的键值对(did =已发布的)。
<?php
if (isset($_POST['pid'])) {
$pid = $_POST['pid'];
$did = $_POST['did'];
$wasFound = false;
$i = 0;
// If the cart session variable is not set or cart array is empty
if (!isset($_SESSION["cart_array"]) || count($_SESSION["cart_array"]) < 1) {
// RUN IF THE CART IS EMPTY OR NOT SET
$_SESSION["cart_array"] = array(1 => array("item_id" => $pid, "did" => $did, "quantity" => 1));
} else {
// RUN IF THE CART HAS AT LEAST ONE ITEM IN IT
foreach ($_SESSION["cart_array"] as $each_item) {
$i++;
if (array_key_exists("pid", $each_item) && $pid == $each_item["pid"]) {
// That item is in cart already so let's adjust its quantity using array_splice()
array_splice($_SESSION["cart_array"], $i-1, 1, array(array("did" => $did, "item_id" => $pid, "quantity" => $each_item['quantity'] + 1)));
$wasFound = true;
} // close if condition
} // close foreach loop
if ($wasFound == false) {
array_push($_SESSION["cart_array"], array("item_id" => $pid, "did" => $did, "quantity" => 1));
}
}
header("location: cart.php");
exit();
}
?>
我希望我已经说清楚了。我知道要调整的代码可能是;
if (array_key_exists("pid", $each_item) && $pid == $each_item["pid"]) {
我需要添加一些内容,以便查看找到的匹配$ pid的数组是否也匹配$ did
答案 0 :(得分:0)
使用Quadtree。
基本上,它就像二次树实施两次
对于每个新项目,您都要询问其product_id是否大于或小于上一项 以及它的design_id是否大于或小于前一项 然后相应地放置新项目。
相对容易存储且非常容易找到。
答案 1 :(得分:0)
这里有几个问题。我认为会话中的第一项需要从索引0开始,而不是1.所以,交换它:
$_SESSION["cart_array"] = array(1 => array("item_id" => $pid, "did" => $did, "quantity" => 1));
以下。我也把它包裹了一下,我建议你也这样做 - 它大大提高了可读性:
$_SESSION["cart_array"] = array(
array("item_id" => $pid, "did" => $did, "quantity" => 1, )
);
此外,如果你需要做一个增量,这意味着数组元素已经存在,所以你不需要做array_splice
就我所知。只需在你的会话中找到它:
foreach ($_SESSION["cart_array"] as $index => $each_item) {
if (array_key_exists("pid", $each_item) && $pid == $each_item["pid"]) {
// That item is in cart already so let's increment its quantity
$_SESSION["cart_array"][$index]['quantity']++;
$wasFound = true;
}
}
正如您所看到的,这也消除了对$i
的需求。
(旁白:您正在接受pid
和did
的用户输入并将其添加到您的数据结构中而不会忽略它们。这可能会导致安全问题。如果它们是整数为了安全起见,请使用(int)
投射它们。
答案 2 :(得分:0)
新变量:
$doubleCheck = "$pip,$did";
新购物车:
$_SESSION["cart_array"] = array(1 => array("item_id" => $pid, "did" => $did, "doubleCheck" => $doubleCheck, "quantity" => 1));
重复添加项目:
if (array_key_exists("doubleCheck", $each_item) && $doubleCheck = $each_item["doubleCheck"]) {
新增项目:
array_splice($_SESSION["cart_array"], $i-1, 1, array(array("did" => $did, "item_id" => $pid, "doubleCheck" => $doubleCheck, "quantity" => $each_item['quantity'] + 1)));
似乎工作正常我需要它。稍后在代码中对变量进行消毒。