Я использую массив $_SESSION
для хранения описания товара, количества и цены для предметов, размещенных в корзине покупок. Это все работает dandy, вот начальная часть кода:
$quantity = 1; // add first item from shop page if(isset($_POST['add_item']) && (!isset($_SESSION['cart']))) { $_SESSION['cart'] = array(); $_SESSION['cart'][$_POST['product_description']] = array('quantity' => $quantity, 'price' => $_POST['product_price']); header("Location: http://website.com/cart.php"); }
Это загружает массив $_SESSION['cart']
с соответствующей информацией, и когда я зацикливаю его на странице корзины, я получаю точное содержимое моей корзины. Все это работает по желанию.
Итак, теперь я хочу найти массив $_SESSION['cart']
чтобы определить, находится ли конкретный элемент в $_SESSION['cart']
, например «iPhone case – Black».
Я пробовал различные формы echo $_SESSION['cart']['product_description']
и ничего не получал. Когда я print_r
массив, я получаю следующее:
Array ( [iPhone case - Black] => Array ( [quantity] => 1 [price] => 9.49 ) )
Что правильно. Выполнение var_dump
дает ожидаемый результат:
array(1) { ["iPhone case - Black"]=> array(2) { ["quantity"]=> int(1) ["price"]=> string(4) "9.49" }
}
Конечно, если есть лучший способ построить массив, я открыт для него.
Все, что я хочу сделать, это выяснить, есть ли «iPhone case – Black» в $_SESSION['cart']
и обслуживать соответствующий код на основе результата.
Я попытался, if (in_array('iPhone case - Black', $_SESSION['cart']))
который ничего не дает, и когда я расширяю его до if (in_array('iPhone case - Black', $_SESSION['cart'][0]))
или ...[1]
или ...['product_description']
Я получаю сообщение об ошибке:
Warning: in_array() expects parameter 2 to be array, null given in...
Что мне не хватает, что просто позволит мне проверить массив $_SESSION['cart']
чтобы найти значение «iPhone case – Black»? Мой единственный вариант – цикл foreach
?
Большое искреннее спасибо заранее!
ОБНОВЛЕНИЕ Копирование сообщений по запросу от @rmmoul:
// add first item from shop page if(isset($_POST['add_item']) && (!isset($_SESSION['cart']))) { $_SESSION['cart'][] = array('product_description'=> $_POST['product_description'], 'quantity' => $quantity, 'price' => $_POST['product_price']); header("Location: http://website.com/cart.php"); }
Возвращает это через print_r
:
Array ( [0] => Array ( [product_description] => iPhone case - Black [quantity] => 1 [price] => 9.49 ) [1] => Array ( [product_description] => iPhone case - Black [quantity] => 1 [price] => 9.49 ) )
поскольку вы используете $_POST['product_description']
качестве ключа, назначенное значение станет ключевым, то есть 'iPhone case - Black'
.
попробуй это:
if (isset($_SESSION['cart']['iPhone case - Black'])){ foreach($_SESSION['cart']['iPhone case - Black'] as $key=>$value){ echo $key." ".$value."<br>"; }
Как насчет isset
?
if ( isset( $_SESSION['cart']['iPhone case - Black'] ) )
Если это true
тогда $_SESSION['cart']['iPhone case - Black']
будет содержать информацию:
array(2) { ["quantity"]=> int(1) ["price"]=> string(4) "9.49" }
Вы не добавляете значение в ключ под названием «product_description», вы называете ключ после описания вашего продукта. Попробуйте изменить эту строку:
$_SESSION['cart'][$_POST['product_description']] = array('quantity' => $quantity, 'price' => $_POST['product_price']);
Для того, чтобы:
$_SESSION['cart'][] = array('product_description'=> $_POST['product_description'], 'quantity' => $quantity, 'price' => $_POST['product_price']);
Затем вы сможете повторить такие значения, как:
echo $_SESSION['cart'][0]['quantity']; echo $_SESSION['cart'][0]['price']; echo $_SESSION['cart'][0]['price'];
Это также должно позволить вам иметь несколько продуктов легко, как $ _SESSION ['cart'] [0], $ _SESSION ['cart'] [1] и т. Д.
Затем вы можете пройти через массив корзины, чтобы проверить определенные элементы, например:
foreach($_SESSION['cart'] as $product) { if($product['product_description'] == 'black iphone') { //do something here echo $product['price']; } }
Это непроверено, хотя и написано по памяти, поэтому может потребоваться немного изменить его, чтобы запустить его, но у него есть суть того, что должно работать на вас.
Редактировать:
Я обновил foreach, чтобы быть более полезным.