PHP填充多维关联数组 - 最简单的方法

3

我想使用$_SESSION来存储购物车中的商品。商品由id定义,每个商品有3种尺寸,每种尺寸都会存储商品的数量。我想使用多维关联数组来实现:

$_SESSION['cart']['id'.$_GET['id']]['size'.$_POST['size']]['quantity'] += $_POST['quantity'];

但我猜想我遇到的问题(提示:未定义的索引)是因为数组没有先被定义。

我希望保持简单,那么最简单的方法是什么?


你在URL中传递了一个“id”,并且总是在POST数据中发送“size”和“quantity”吗?否则,这就是你的问题所在。 - Adam Link
是的,我做。代码中还有这个:if(isset($_POST['size'])){... - koubin
2个回答

3
您的问题在于您只是假定项目已经设置在$_SESSION中。您需要假设它们没有被设置,并开始添加它们。
您可以使用isset()函数。
if(!isset($_SESSION['cart']['id'.$_GET['id']])) {
    $_SESSION['cart']['id'.$_GET['id']] = array(
        'sizeONE' => array(
            'quantity' => 0
        ),
        'sizeTWO' => array(
            'quantity' => 0
        ),
        'sizeTHREE' => array(
            'quantity' => 0
        ),
    );
}

显然,您需要修改上面的内容,可能只设置所需的产品ID,然后通过类似于isset()的方式添加所选大小。我只是向您展示如何创建初始结构数组。


我并不假设它们被设置了。它们没有设置。我只是想知道最简单的方法来实现这个。就像我上面写的代码一样。也许可以使用对象代替数组。顺便问一下,如果连"id"都没有设置,你的定义会是什么样子?这不会太复杂了吗? - koubin
@koubin 太简单了!如果没有设置产品(id),您基本上不会将其存储在会话中,因为您需要它来识别产品? - Darren
1
我不理解最后一个评论,但我猜在代码前面加上类似这样的东西就可以解决问题了:“if(!isset($ _SESSION ['cart'])){ $ _SESSION ['cart'] = array();}” 我是对的吗? - koubin
完全正确@koubin。我上一条评论的意思是,如果用户不想将产品添加到购物车会话中,您就不会将其添加到那里。 - Darren
1
好的,谢谢。我希望能有一个简单而美观的解决方案,但可能没有我想象中的那样。 - koubin

1
我认为最好的存储方式不是使用多维数组,而是使用对象(不是在 $_SESSION 中,但这是一个完全不同的话题)。
如果你想使用对象来处理这个问题,我建议使用以下变体:
$myItem = new stdClass;
$myItem->id = $_GET['id'];
$myItem->sizeOne = new stdClass;
$myItem->sizeOne->name = "sizeOne";
$myItem->sizeOne->quantity = 1;
// repeat for sizeTwo and sizeThree

$_SESSION['cart'][$myItem->id] = $myItem;

好处:

更多的面向对象编程(OOP)方法应用于您的程序中。

缺点:

将对象存储在$_SESSION中可能会导致可扩展性问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接