如何从laravel中的会话数组中删除项目

Ale*_*len 3 php session laravel laravel-5 laravel-5.3

这是我有一个会话的问题

session('products')
Run Code Online (Sandbox Code Playgroud)

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

session('products')
array:4 [?
0 => "1"
1 => "2"
2 => "4"
3 => "1"
]
Run Code Online (Sandbox Code Playgroud)

现在我要删除让我们说4我该怎么做?我试过方法

session()->pull($product, 'products');
Run Code Online (Sandbox Code Playgroud)

但它不起作用!

其他方案

session()->forget('products', $product);
Run Code Online (Sandbox Code Playgroud)

它也没用

Alb*_*221 8

您AFAIR必须首先检索整个数组,编辑它然后再次设置它.如果要按产品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);
Run Code Online (Sandbox Code Playgroud)

被误解的问题

Session::pull第一个参数作为项目删除,第二个参数作为要返回的默认值.你错了参数的顺序.尝试:

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

正如我在源代码中看到的那样,Session::forget需要字符串或数组,因此您应该只指定第一个参数:

session()->forget('products');
Run Code Online (Sandbox Code Playgroud)


小智 5

此方法未经测试:

Session::forget('products.' . $i);
Run Code Online (Sandbox Code Playgroud)

注意这里的点符号,值得一试。如果那不起作用,您可以随时执行以下操作:

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