Папка PHP Sessions: обновите продукт, если он уже является идентификатором сеанса

Я изо всех сил пытался найти решение для простой корзины покупок с $_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; }