更新:
我认为出现这个问题是因为最后一个键号可以从Session Array中删除,但是当我不删除最后一个键号时,就会得到不同的格式。还不知道怎么解决这个问题。
我目前正在通过角请求存储和检索数据,这些请求从Laravel中放置和检索值。
// Code for pushing into Laravel Session Array
Session::push('cart', $object);
// Code for retrieving data into Laravel Session Array
return Session::get('cart');
现在,我使用foreach循环来更新quantity或者这个问题的内容:在quantity为0时,从Laravel购物车中删除一个对象。
public function updateQuantity($id, $quantity, $operator){
$cart = Session::get('cart', []);
foreach ($cart as $index => &$product) {
if ($product['id'] == $id) {
if($operator == '+'){
$product['quantity'] = $product['quantity'] + $quantity;
} else if($operator == '-'){
$product['quantity'] = $product['quantity'] - $quantity;
if($product['quantity'] == 0){
Session::forget('cart.' . $index);
$cart = Session::get('cart', []);
Session::push('cart', $cart);
}
}
Session::set('cart', $cart);
$this->new_product = false;
break;
}
}
return $this->new_product;
}
上面代码的这一部分正在改变我的JSON输出:
Session::forget('cart.' . $index);
$cart = Session::get('cart', []);
Session::push('cart', $cart);
删除之前的JSON情况:
[
{
"id":293,
"quantity":2
},
{
"id":294,
"quantity":2
}
]
删除后的JSON情况:
{"1":{"id":293,
"quantity":2}
}
,但应该是:
[
{
"id":293,
"quantity":2
}
]
这是我的角Get请求,它简单地调用:return Session::get('cart')
Cart.getCart()
.then(function (success){
$scope.cart = success.data;
}).catch(function (e){
console.log("got an error in the process", e);
});
任何帮助都将不胜感激。不确定是什么原因导致json数组转换成不同的数据模型。
附加注意:当我在会话中添加最后一个对象并再次删除同一个对象时,它按预期工作。当我切换删除顺序时,它会把json弄乱。
发布于 2017-05-31 13:09:43
更新更好的解决方案:
从另一篇堆栈溢出文章中获得了这一理论基础:deleting JSON array element in PHP, and re-encoding as JSON
代码调整在这里:
Session::forget('cart.' . $index);
$cart = Session::get('cart', []);
Session::push('cart', $cart);
将是:
Session::forget('cart.' . $index);
Session::get('cart', []);
return null;
获取会话购物车值
return json_encode(array_values(Session::get('cart')));
唯一需要的就是使用array_values
。这将重新编号json数组。
旧解决方案:
通过替换以下内容解决了这一问题:
Session::forget('cart.' . $index);
$cart = Session::get('cart', []);
Session::push('cart', $cart);
将下面的代码作为替换:
Session::forget('cart.' . $index);
$temp_cart = Session::get('cart', []);
Session::forget('cart');
foreach($temp_cart as $c){
Session::push('cart', $c);
}
return null;
不要认为这是最好的解决方案,因为我正在重建整个会话阵列,所以任何想法都会受到欢迎。
https://stackoverflow.com/questions/44284213
复制相似问题