1

なぜこれが起こっているのかわかりませんが、この問題に頻繁に遭遇するようです。ショッピング カートの元の JSON は次のとおりです。

{
    "cartitems": [
        {
            "Product_ID": "1",
            "quantity": "1",
            "cartid": 1
        },
        {
            "Product_ID": "5",
            "quantity": "1",
            "cartid": 4
        },
        {
            "Product_ID": "5",
            "quantity": "1",
            "cartid": 6
        },
        {
            "Product_ID": "5",
            "quantity": "1",
            "cartid": 7
        }
    ]
}

この JSON データは $_SESSION 変数 $_SESSION['cart_items'] に保存されます

このコードはアイテムを削除するために使用されます:

$cartid = $_POST['varA'];

/* Remove the item */
foreach ($_SESSION['cart_items']['cartitems'] as $key => $product) {
    if ($product['cartid'] == $cartid) {
        unset($_SESSION['cart_items']['cartitems'][$key]);
    }
}


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

carid = 7 のアイテムが削除されると、終了すると次のようになります。

{
    "cartitems": {
        "0": {
            "Product_ID": "1",
            "quantity": "1",
            "cartid": 1
        },
        "1": {
            "Product_ID": "5",
            "quantity": "1",
            "cartid": 4
        },
        "2": {
            "Product_ID": "5",
            "quantity": "1",
            "cartid": 6
        }
    }
}

キーを追加します!これは、アイテムが 3 つ以上ある場合にのみ発生するため、困惑します。これらのキーが作成されないようにコードを書き直す方法はありますか?

4

2 に答える 2

2

PHP では、連想と数値インデックスの両方のマップ/リスト/配列に使用される配列のみがあります。[...]Javascript/JSON には、数値インデックス付き配列 ( ) とオブジェクト マップ ( )という 2 つの異なる概念があります{ foo : ... }。PHPjson_encodeが配列をエンコードするときにどちらを使用するかを決定するために、舞台裏にはいくつかのロジックがあります。通常、配列キーが連続しており、すべて数値である場合、配列は JSON 配列 ( [...]) にエンコードされます。1 つでもキーの順序が間違っていたり、数字以外のキーがあったりした場合は、代わりに JSON オブジェクトが使用されます。

特に配列操作がオブジェクトをトリガーする理由はわかりません。ただし、これを回避するには、配列キーをリセットして、それらが数値的に連続してインデックス付けされるようにすることができます。

$_SESSION['cart_items']['cartitems'] = array_values($_SESSION['cart_items']['cartitems']);
于 2012-05-18T05:56:54.217 に答える
0

これを試してみてください。自動キーを使用して、配列を新しい配列に転送します。

/* Remove the item */
foreach ($_SESSION['cart_items']['cartitems'] as $key => $product) {
    if ($product['cartid'] == $cartid) {
        unset($_SESSION['cart_items']['cartitems'][$key]);
    }
}
$var=array();
foreach($_SESSION['cart_items']['cartitems'] as $key => $product) {
        $var['cart_items']['cartitems'][] = $product;
}
echo json_encode($var['cart_items']);
于 2012-05-30T06:36:47.740 に答える