Я изо всех сил пытался найти решение для простой корзины покупок с $_SESSION
. Я сохранил это очень просто, и это мой код прямо сейчас
if ( Input::isPost('add') ) { $id = Input::get('id'); $qta = Input::post('qta'); $size = Input::post('size'); if ( !isset($_SESSION['cart']) ) { $_SESSION['cart'] = array(); } if ( array_key_exists($id, $_SESSION['cart']) ) { if ( $_SESSION['cart'][$id][0] == $size ) { $_SESSION['cart'][$id][1]+=$qta; } else { $_SESSION['cart'][$id] = array( $size, $qta ); } } else { $_SESSION['cart'][$id] = array( $size, $qta ); } }
Итак, что делает этот код?
1) Если $_SESSION['cart']
не существует, создайте его, иначе добавьте новый элемент. 2) Когда вы добавляете в корзину элемент, вы должны выбрать размер и количество для этого предмета. 3) Если этот элемент уже существует в массиве корзины, проверьте, совпадает ли размер, если это так просто обновить количество. Вот проблема, если элемент уже существует (проверяет $_SESSION['cart'][$id]
), но размер отличается, не обновляйте текущий, а создавайте новый элемент. Проблема в том, что текущий заменяется вместо добавления одного, поэтому вместо двух продуктов с одним и тем же id
но другого size
, у меня только самый последний.
Если бы вы могли помочь мне решить эту проблему, я буду очень благодарен!
Заранее спасибо.
Попробуйте использовать размер в качестве ключа для дополнительного измерения в многомерном массиве. Ваш текущий код позволяет вам иметь только один размер для каждого элемента.
У вас будет что-то вроде:
if ( Input::isPost('add') ) { $id = Input::get('id'); $qta = Input::post('qta'); $size = Input::post('size'); if ( !isset($_SESSION['cart']) ) { $_SESSION['cart'] = array(); } if ( array_key_exists($_SESSION['cart'][$id][$size]) ) { $_SESSION['cart'][$id][$size] += $qta; } else { $_SESSION['cart'][$id][$size] = $qta; } }
Лучшим способом сделать это будет создание другого массива с sizes
и размерами хранилища. Таким образом, ваш код будет выглядеть примерно так:
if (in_array($size, $_SESSION['cart'][$id]['sizes'])) { //The size has been added to the cart } else { //The size isn't in the cart so add it $_SESSION['cart'][$id]['sizes'][] = $size; }
Кроме того, вместо того, чтобы хранить количество, подобное
$_SESSION['cart'][$id][1]+=$qta;
Почему у вас нет более значимых ключей, чтобы вы могли лучше понять содержимое массива. Например
$_SESSION['cart'][$id]['qty']+=$qta;
Проблема здесь:
if ( $_SESSION['cart'][$id][0] == $size ) { $_SESSION['cart'][$id][1]+=$qta; } else { $_SESSION['cart'][$id] = array( $size, $qta ); }
Если размер отличается, вы заменяете его новым массивом ( else
блока). Это ваш массив:
Array( 'cart'=>array( 'id'=>array('size', 'qta') ) )
С этой структурой у вас может быть только один размер для id, поэтому, если вы хотите добавить другое вместо старого, вы должны подумать над этим:
Array( 'cart'=>array( 'id'=>array(0=>array('size1'=>'qta1'), 1=>array('size2'=>'qta2')) ) )
Конечно, это означает, что вам нужно будет перебрать массив, чтобы найти нужный размер, а затем обновить qta. Не весело.
С этой структурой может быть интереснее работать:
Array( 'cart'=>array( 'id'=>array('size1'=>'qta1', 'size2'=>'qta2') ) )
Таким образом, вместо проверки $_SESSION['cart'][$id][0] == $size
, вам просто нужно проверить, существует ли $_SESSION['cart'][$id][$size]
(с массивом_key_exists ) и продолжайте 🙂
$postedQuantity = intval($_POST['quantity']); $postedProduct = $_POST['product']; $postedSize = $_POST['size']; $productId = $_POST['product'] . $_POST['size'];// concat the product name/Id and //the size form a new array-key.it will be unique. if(empty($_SESSION)){ $_SESSION['cart_items'] = array(); } if(empty($_SESSION['cart_items'])) { $_SESSION['cart_items'][$productId] = array('name'=> $_POST['product'], 'quantity'=> intval($_POST['quantity']), 'size'=>$_POST['size'], ); } elseif(!array_key_exists($productId,$_SESSION['cart_items'])) { $_SESSION['cart_items'][$productId] = array('name'=> $_POST['product'], 'quantity'=> intval($_POST['quantity']), 'size'=>$_POST['size'], ); } else { $_SESSION['cart_items'][$productId]['quantity'] += $postedQuantity; }