如何在多维数组中搜索多个匹配的键值对

时间:2014-07-06 09:10:37

标签: php arrays e-commerce cart

我目前正在使用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

3 个答案:

答案 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的需求。

(旁白:您正在接受piddid的用户输入并将其添加到您的数据结构中而不会忽略它们。这可能会导致安全问题。如果它们是整数为了安全起见,请使用(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)));

似乎工作正常我需要它。稍后在代码中对变量进行消毒。