Вы говорите коду, чтобы сбросить весь сеанс, так оно и есть.
Включите ключ в foreach и сбросьте ключ, который нужно отменить.
foreach($_SESSION['product'] as $key => $item) {
if ($_GET["partid"] == $item['product_id']) {
unset($_SESSION["product"][$key]);
}
}
Вы также можете найти конкретное значение и пропустить весь цикл.
if (isset($_POST['removeItem'])) {
$prodId=$_SESSION['prodItemId'];
$key = array_search($_GET["partid"], array_column($_SESSION['product'], 'product_id'));
if($key !== false) unset($_SESSION["product"][$key]);
}
Array_search ищет партию GET и, если она найдена, возвращает ключ того, где она находится, в противном случае возвращает ложь.
Если у вас есть несколько элементов массива, которые необходимо удалить, вышеуказанный метод array_search удалит только первый.
Однако вы можете зациклить array_search, чтобы получить их все.
if (isset($_POST['removeItem'])) {
$prodId=$_SESSION['prodItemId'];
$prodID = array_column($_SESSION['product'], 'product_id'); // creates a flat array that can be searched
while($key = array_search($_GET["partid"], $prodID)){
unset($_SESSION["product"][$key]);
}
}
Здесь мы ищем, чтобы увидеть, есть ли соответствующее значение, если мы удаляем ключ, то цикл while ищет снова.
Если новое совпадающее значение - forum, оно удаляется, если не array_search вернет false и прервет цикл while.
Четвертый метод - почти сохранить код, который у вас есть, но зациклить массив по ссылке с помощью &
и сбросить элемент.
foreach($_SESSION['product'] as &$item) { // notice the &
if ($_GET["partid"] == $item['product_id']) {
unset($item); //because we used &, we can now unset $item
}
}
Пятый метод - использовать array_diff и array_intersect.
Этот метод является самым медленным и не должен использоваться на больших массивах, он может использоваться с очень небольшой разницей на меньших массивах (менее 50-100 элементов).
if (isset($_POST['removeItem'])) {
$prodId=$_SESSION['prodItemId'];
$_SESSION['product'] = array_intersect_key($_SESSION['product'], array_diff(array_column($_SESSION['product'], 'product_id'), $_GET["partid"]));
}
Чтобы объяснить это, мне нужно объяснить это в «обратном» порядке по сравнению с тем, что вы прочитали, поскольку оно вложено.
Я начинаю с создания плоского массива с array_column.
Этот массив содержит только продукты.
Я использую array_diff для возврата только тех элементов, которые не соответствуют $ _GET ["partid"].
То, что мы получаем - это плоский массив только с продукцией. Это может показаться бесполезным, и это так, но ключи полезны.
Ключи соответствуют тому, что находится в массиве сеанса.
Поэтому, если мы используем array_intersect_key и используем $ _SESSION ['product'] в качестве основного массива и ключи из array_diff, то на выходе получаются элементы в $ _SESSION ['product'], которые не соответствуют $ _GET ["partid"].
Сложно в фоновом режиме, но просто на вкладыше.