如何在SESSION类型数组中推送和拉取变量

时间:2013-12-07 14:31:13

标签: php arrays session

我愿意使用简单的PHP SESSION ARRAY创建Shop Cart。我试图搜索不同的StackOverFlow问题,但这些问题都没有给我完全解决我的问题。也许我在做任何愚蠢的错误。然而,

我这样做:

<!-- SHOPPING CART -->
<?php
if(isset($_REQUEST['atc']))
{
    $item = $_REQUEST['atc'];
    $_SESSION['cart'] = array();

    array_push($_SESSION['cart'], $item);
    //$_SESSION['cart'][] = $item;

     foreach($_SESSION["cart"] as $key => $val)
    { 
        echo $key . ">" . $val;
    }
}
?>
<!-- SHOPPING CART -->

当用户点击同一页面上的“添加到购物车”按钮时,我收到$_REQUEST['ate'](整数值/产品ID)。然后我将值放在$ item中,然后我将$_SESSION['cart']声明为Array。然后我尝试了array_push,甚至尝试$_SESSION['cart'][]推送整数值。但每次只更新第一个元素时,$_SESSION['cart'][0]会存储值,而不是$_SESSION['cart'][1]或其他元素。

2 个答案:

答案 0 :(得分:1)

问题是您每次都通过$_SESSION['cart']$_SESSION['cart'] = array();重新定义为空数组,然后只推送一个元素。

试试这个

if(isset($_REQUEST['atc']))
{
    $item = $_REQUEST['atc'];

    if (!isSet($_SESSION['cart']))
        $_SESSION['cart'] = array();

    array_push($_SESSION['cart'], $item);
    //$_SESSION['cart'][] = $item;

     foreach($_SESSION["cart"] as $key => $val)
    { 
        echo $key . ">" . $val;
    }
}

现在,只有用户第一次想要添加项目时,$_SESSION['cart']将作为空数组启动。第二次($_SESSION['cart']已经是一个包含一个元素的数组),第二个元素将被正确推送。


如果您希望元素是唯一的(如注释中所述),则可以使用元素id作为键(并且数组只能具有唯一键)。

if(isset($_REQUEST['atc']))
{
    $item = $_REQUEST['atc'];

    if (!isSet($_SESSION['cart']))
        $_SESSION['cart'] = array();

    if (!array_key_exists($item, $_SESSION['cart']))
        $_SESSION['cart'][$item] = 1;
    else
        $_SESSION['cart'][$item]++;

    foreach($_SESSION["cart"] as $key => $val)
    { 
        echo $key . ">" . $val;
    }
}

如果项目已经在购物车中(array_key_exists),则首先检查该项目是否已添加。如果是,它将增加该值,因此您可以跟踪特定项目在购物车中的频率(如果您不想要该功能,只需丢失else语句)

答案 1 :(得分:0)

您遇到的问题是每次获得物品时都会覆盖$ _SESSION ['cart']。试试

 if(!isset($_SESSION['cart'])
    $_SESSION['cart'] = array();

    //array_push($_SESSION['cart'], $item);
    $_SESSION['cart'][] = $item;

首先检查会话是否已存在,然后添加项目。

Note: If you use array_push() to add one element to the array it's better to use $array[] = because in that way there is no overhead of calling a function.