Dev.W
Dev.W

Reputation: 2370

Laravel 5.1 - Removing item from array in session

I have laravel application and I store items in a basket using the session.

function that adds item to basket

public function addItem($id)
    {
        session()->push('user.basket', $id);
        return back();
    }

function which removes item from basket

public function removeItem($id)
    {
        session()->pull('user.basket', $id);
        return back();
    }

When I add items this works fine, however when I come to remove an item that's in the basket the whole basket is removed?

Upvotes: 2

Views: 1128

Answers (2)

SebHallin
SebHallin

Reputation: 891

As you probably know, an array has values and each value has a key (['key1' => 'value1']), the value could also be another array. In your example, you have used an array (user.basket), each dot represents a new level of the array.

Remove by value

You push your ID to the session array. You don't specify any key and it will therefore get an unknown key, so you want to remove it using a value (your ID). The variable $valueToRemove in the example is your ID.

session()->put('user.basket', array_diff(session()->get('user.basket'), [$valueToRemove]));

To explain: Replace the user basket with everything in user basket that isn't in the array that only contains the $valueToRemove.

Remove by key

Lets say you know the which key (position) you want to remove, for example if you loop throw the array foreach(session()->get('user.basket') as $key => $value). Then you can remove the specific key using forget.

session()->forget('user.basket.'.$keyToRemove); // example: 'user.basket.7'

Your code

public function removeItem($id)
{
    session()->put('user.basket', array_diff(session()->get('user.basket'), [$id]))
    return back();
}

Upvotes: 0

Mina Abadir
Mina Abadir

Reputation: 2981

The session()->pull('key','default') method removes the item with key, and returns the default value if it does not exist.

There is no way to delete item from array directly, you need to implement it:

$array = session()->pull('user.basket',[]);
unset($array[$id]);
session()->put('user.basket',$array);

Upvotes: 1

Related Questions