Intereting Posts

PHP добавляет ключи для декодирования, а затем кодирует данные JSON

Я не знаю, почему это происходит, но я часто сталкиваюсь с этой проблемой. Вот мой оригинальный 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']);