Я использую массив $_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, чтобы быть более полезным.