将值推送到数组PHP的正确方法?

时间:2012-05-17 06:32:16

标签: php arrays json

我遇到了一个有点恼人的问题。这是我的PHP代码。忽略变量的来源。这适用于购物车功能,但适用于许多不同的领域。

$data_set = json_decode(stripslashes($_POST['varA']), true);
$pid = $pid['product_id'];
$quantity = $pid['quantity'];

$_SESSION['cartid'] = $_SESSION['cartid'] + 1;

$product_data = array("Product_ID" = > $pid, "quantity" = > $quantity, "cartid" = > $_SESSION['cartid']);

我的问题发生在代码中的这个地方。我首先检查Session变量是否有值,如果没有,则继续创建一个关联数组。

if (empty($_SESSION['cart_items'])) {
    $_SESSION['cart_items'] = array("items" = > $product_data);
} else {
    array_push($_SESSION['cart_items']['items'], $product_data);
}


echo json_encode($_SESSION['cart_items']);

第一项“添加”后的最终结果如下所示:

{
    "items": {
        "Product_ID": "2",
        "quantity": "1",
        "cartid": 1
    }
}

但是,在第一次添加几次之后,每个值都会获得一个键:

{
    "items": {
        "0": {
            "Product_ID": "2",
            "quantity": "1",
            "cartid": 2
        },
        "1": {
            "Product_ID": "2",
            "quantity": "1",
            "cartid": 3
        },
        "Product_ID": "2",
        "quantity": "1",
        "cartid": 1
    }
}

如何防止这些密钥发生?这可能吗?如果没有,如何重写,以便每次都添加密钥?这是否可以在前端的JS中解析和循环?

抱歉,我有这么多问题。任何帮助都非常感谢。

3 个答案:

答案 0 :(得分:1)

在第一次迭代中,$_SESSION['cart_items']为空,所以你运行它:

$_SESSION['cart_items'] = array("items" => $product_data);

这会创建$_SESSION['cart_items']['items'],但您只需使用产品填充它;你应该把它定义为数组:

$_SESSION['cart_items'] = array("items" => array($product_data));

这将创建一个包含单个项目的数组,稍后您可以使用array_push扩展该项目。

话虽如此,你可以用以下方式替换整个条件:

$_SESSION['cart_items']['items'][] = $product_date;

PHP会自动创建一个空数组(如果它尚不存在),然后将产品数据添加为下一个元素。

答案 1 :(得分:0)

这是因为这一行:

$_SESSION['cart_items'] = array("items" = > $product_data);

您基本上在该行中说'items'键具有产品数据,而不是键入项目。它应该是:

$_SESSION['cart_items']['items'] = array($product_data);

键 - 将始终发生,除非您希望数据覆盖另一个。如果你不想要键(0,1等),那么唯一的另一个选择是合并数据。在这种情况下,它将是:

$ _ SESSION [ 'cart_items'] [ '项'] + = $ product_data;

..但我认为这不是你想要的。

答案 2 :(得分:0)

您不需要items,请尝试以下方式。

if (empty($_SESSION['cart_items'])) {
    $_SESSION['cart_items'] = array($product_data);
} else {
    $_SESSION['cart_items'][] = $product_data;
}