Как удалить запись массива из сессии - PHP

145
26 октября 2018, 15:20

есть вот такой массив в котором лежит 3 товара и передается через $_SESSION['shopping_cart'][]:

    array(3) {
  [0]=>
  array(3) {
    ["variant_id"]=>
    int(154)
    ["amount"]=>
    int(1)
    ["lvl"]=>
    int(1)
  }
  [1]=>
  array(3) {
    ["variant_id"]=>
    int(157)
    ["amount"]=>
    int(1)
    ["lvl"]=>
    int(6)
  }
  [2]=>
  array(3) {
    ["variant_id"]=>
    int(167)
    ["amount"]=>
    int(1)
    ["lvl"]=>
    int(0)
  }
}

Как мне удалить товар с variant_id = 157, то-есть весь массив [1], но я знаю только variant_id. Буду благодарен за вашу помощь!

Answer 1

Как вариант можно через цикл:

$arr = [
    ['variant_id' => 154, 'amount' => 1, 'lvl' => 1],
    ['variant_id' => 157, 'amount' => 1, 'lvl' => 6],
    ['variant_id' => 167, 'amount' => 1, 'lvl' => 0]
];
foreach($arr as $key => $value)
{
    if ($value['variant_id'] == 157)
        unset($arr[$key]);
}
print_r($arr);

Второй вариант с помощью функции array_filter:

$id = 157;
$arr = array_filter($arr, function ($x) use ($id) {
    return $x['variant_id'] !== $id;
});
print_r($arr);
Answer 2

Вы можете использовать, к примеру, функцию array_filter и включить туда более сложную логику, если понадобится. Ну смотрите.

$resultArray = array_filter($sessionArray, function ($value) use ($toDelete) {
    return $value['variant_id'] !== $toDelete
});

Объяснение: $sessionArray ваши исходные данные, а $toDelete значение, которое нужно отбросить. Соответственно, вы можете оформить анонимную функцию отдельно и использовать многократно передавая то, что вам нужно удалить, а если быть точнее, то в данном контексте вы фильтруете свой ассоциативный массив, оставляя что вам нужно. Вы можете передать в use, например, еще одно значение, которое будет являться ключом, который вам нужно будет отфильтровать и тогда сможете этой функцией, передавая ей соответствующие значения, добиваться фильтрации любых полей по заданным значениям.

Answer 3

Можно через поиск:

$arr = [
    ['variant_id' => 154, 'amount' => 1, 'lvl' => 1],
    ['variant_id' => 157, 'amount' => 1, 'lvl' => 6],
    ['variant_id' => 167, 'amount' => 1, 'lvl' => 0]
];
$id = 157;
if(($key = array_search($id,array_column($arr, 'variant_id'))) !== FALSE){
    unset($arr[$key]);
}

Будет быстрее, чем filter

READ ALSO
Сжатие изоображений на yii2

Сжатие изоображений на yii2

Как сжимать изображение, кадрировать со стороны сервера и выводить их так

181
PHP Преобразование цвета red=1 green=1 blue=1 в hex

PHP Преобразование цвета red=1 green=1 blue=1 в hex

Получаю с гугл таблицы цвет ячейки, выдает в таком виде red=1 green=1 blue=1

145
Не работают комментарии WordPress

Не работают комментарии WordPress

Не могу разобраться как создать кастомную форму для отправки комментариев без привязки к стандартной, поискал по интернету нашел необходимую...

158
Проблема автозагрузка PHP

Проблема автозагрузка PHP

Не получается подключить автозагрузкуКак правильно писать код для автозагрузки? Класс

167