Я не знаю, почему это происходит, но я часто сталкиваюсь с этой проблемой. Вот мой оригинальный 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']);
с$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']);
Когда элемент с cartid = 7 удаляется, результатом является это, когда он является endoded:
{ "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 предметов, что меня озадачивает. Есть ли способ переписать мой код, чтобы он не создавал ключи от этих тегов?
В PHP существуют только массивы, которые используются как для ассоциативных, так и для численных индексированных карт / списков / массивов. Javascript / JSON имеет два разных понятия: числовые индексированные массивы ( [...]
) и карты объектов ( { foo : ... }
). Для json_encode
PHP, чтобы решить, что использовать при кодировании массива, есть некоторая логика за кулисами. Как правило, если ключи массива смежны и все численные, массив кодируется в массив JSON ( [...]
). Если есть даже один ключ не в порядке или нечисловой ключ, вместо него используется объект JSON.
Почему ваши манипуляции с массивом, в частности, запускают объект, я не знаю. Чтобы этого избежать, вы можете сбросить ключи массива, чтобы убедиться, что они численно, сопеременно индексируются:
$_SESSION['cart_items']['cartitems'] = array_values($_SESSION['cart_items']['cartitems']);
Попытайтесь, я работал на меня. Перенесите массив в новый массив с помощью автоматических ключей:
/* 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']);
с/* 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']);