如何在Laravel中从会话数组中删除项目

4

这里有一个问题,我有一个会话(session)

session('products')

这实际上是一个包含id的数组

session('products')
array:4 [▼
0 => "1"
1 => "2"
2 => "4"
3 => "1"
]

现在我想删除一个叫做4的东西,该怎么办?我尝试了一种方法。

session()->pull($product, 'products');

但它没有奏效!

其他解决方案

session()->forget('products', $product);

它也没起作用。


你只有值还是同时也有键? - Luca Jung
@LucaJung 只有值 - Alen
4个回答

19

据我记得,您需要先检索整个数组,然后编辑它,再重新设置它。如果你想按产品ID删除,假设这是一个数组值,你可以使用这个:PHP按值(而非键)从数组中删除元素

$products = session()->pull('products', []); // Second argument is a default value
if(($key = array_search($idToDelete, $products)) !== false) {
    unset($products[$key]);
}
session()->put('products', $products);

问题理解错误

Session::pull方法的第一个参数是要删除的项目,第二个参数是默认返回值。你把参数顺序搞错了。请尝试:

session()->pull('products'); // You can specify second argument if you need default value

根据我在源代码中看到的,Session::forget 接受字符串或数组,因此您应该只指定第一个参数:

session()->forget('products');

这正是我在寻找的,非常感谢您的解释 :) - Alen

5

此方法未经过测试:

Session::forget('products.' . $i);

注意这里的点符号表示法,值得一试。如果这不起作用,您始终可以这样做:

$products = Session::get('products'); // Get the array
unset($product[$index]); // Unset the index you want
Session::set('products', $products); // Set the array again

0

如果您有一个从购物车中删除商品的函数,可以按照以下方式完成

public function deleteProductoCart(Producto $producto) {
    $cart = \Session::get('products');
    unset($cart[$producto->id]);
    \Session::put('products', $cart);
    return redirect()->route('tu-ruta');
}

感谢您尝试回答问题。Stack Overflow 要求内容必须为英文。请考虑用英文重新撰写您的答案。 - atiquratik

0
我也在寻找这个功能,但最终是这样做的。由于你想要删除的是“按值”,所以这个方法也是为了一次性删除多个产品而设计的!
例如:从购物车中删除产品ID为5、11和541的产品...
// Get the current session products
$products = session()->get('products');

// Remove certain products
$products = array_diff($products, [5, 11, 541]);

// Set the session with the new altered products
session()->put('products', $products);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接