2016-12-14 1 views
0

Сегодня я работаю над корзиной покупок для сценария веб-сайта. Когда они добавляют элемент в корзину, он сохраняется в переменной $_SESSION под названием cartitems. Я храню массивы в массиве $_SESSION['cartitems'], содержащие itemid и количество предметов, которые они пытаются добавить в корзину. Просто добавление элементов работает потрясающе, используя приведенный ниже код, но мне нужно, чтобы они увеличивали значение элементов в массиве, предполагая, что они пытаются добавить больше одного и того же элемента вместо простого добавления нового массива в SESSION. Вот пример:Добавление элементов в массив, но если они существуют в массиве, увеличьте это значение

-> User 1 visits the website. 
    - Add 5 melons to cart. 
    - Add 3 lemons to cart. 
    - Add 2 more melons to cart. 

Мой массив будет печатать что-то вроде:

array(
     array{0 => 1, 1 => 5}, 
     array{0 => 2, 1 => 3}, 
     array{0 => 1, 1 => 2} 
) 

.. в то время как цель добавления их было бы что-то вместо того, чтобы, как в следующем:

array(
     array{0 => 1, 1 => 7}, 
     array{0 => 2, 1 => 3} 
) 

Так что значение на itemid 1 будет увеличено до 7. Я также должен знать, что его на, перед добавлением дополнительных 2, incas есть только 6 дынь на складе. Не хотел бы, чтобы кто-то нашел способ добавить больше дынь, а потом остался на биржевом поле, если бы мы!

Я уже передаю количество акций, вместе с погодой, оно имеет неограниченную поддержку по акциям или покупает лимиты на предмет, поэтому у меня есть вся информация, необходимая для ограничения материала (что я уже делаю при добавлении элементов) , просто нужен способ изменить массив, если его уже там, чтобы увеличить число. Вот код, я использую для добавления элементов:

if(isset($_POST['quantity'])) { 
    // Cast quantity to an int for protection 
    $quantity = (int) $_POST['quantity']; 
    if(!empty($quantity) && $quantity > 0) { 
     $errors = 0; 
     // It doesn't support unlimited stock so we check stock level 
     if($unlimstock == "0") { 
      if($quantity > $stock) { 
       $quantity = $stock; 
      } 
      if($buylimit > 0) { 
       if($quantity > $buylimit) { 
        $errors = "1"; 
       } 
      } 
     } 
     if($errors == 0) { 
      $_SESSION['cartitems'][] = array($itemid, $quantity); 
      header("Location: cart.php"); 
      die(); 
     } 
    } 
} 

Каков наилучший подход, чтобы проверить, если он находится в массиве, если увеличить значение, если я не могу добавить его, как я уже, и если он есть, какова ценность, поэтому я знаю, насколько она может быть увеличена. Спасибо, парни!

ответ

1

Для упрощения кода ваших $_SESSION['cartitems'] должны хранить данные как:

$_SESSION['cartitems'] = [ 
    'product_id1' => 'quantity1', 
    'product_id2' => 'quantity2', 
]; 

Затем обновляет количество составляет:

if (isset($_SESSION['cartitems'][$product_id])) { 
    $_SESSION['cartitems'][$product_id] += $quantity; 
} else { 
    $_SESSION['cartitems'][$product_id] = $quantity; 
} 

Если изменение $_SESSION['cartitems'] структуры не представляется возможным, то вы должны итерацией над ним:

$found = false; 
foreach ($_SESSION['cartitems'] as $key => $item) { 
    // I suppose that 0-indexed element stores id 
    if ($item[0] == $product_id) { 
     // I suppose that 1-indexed element stores quantity 
     $_SESSION['cartitems'][$key][1] += $quantity; 
     $found = true; 

     // break as certain element found 
     break; 
    } 
} 
if (!$found) { 
    $_SESSION['cartitems'][] = array($product_id, $quantity); 
} 
+0

Очень хорошее предложение! Я попробую это, спасибо. – Kaboom

+0

В случае затруднений я добавил код для текущей '$ _SESSION'. Таким образом, вы можете сравнить, какой из них проще). –

+0

. Второй вариант работает лучше, поскольку его проще реализовать с текущей структурой, и я не обязательно знаю все элементы в сеансе, поэтому потребуется сделать немного больше записи, чтобы сделать первый вариант работа, но второй вариант работает красиво. Просто нужно добавить мой чек сейчас, если он перейдет лимит на акции. – Kaboom

0

Heres, что я сделал, включая заключительный факт chec k благодаря @u_mulder:

// Set that we dont't see it by default 
$found = false; 
foreach($_SESSION['cartitems'] as $key => $item) { 
    if($item[0] == $itemid) { 
     // If it has unlimited stock, who cares, otherwise fact check it 
     if($unlimstock == "1") { 
      $_SESSION['cartitems'][$key][1] += $quantity; 
      $found = true; 
      break; 
     } else { 
      // If it's less than or equal to stock, we can try and add it 
      if(($_SESSION['cartitems'][$key][1] + $quantity) <= $stock) { 
       // If it has a buy limit, we set max to buy limit and check it 
       if($buylimit > 0) { 
        if(($_SESSION['cartitems'][$key][1] + $quantity) <= $buylimit) { 
         $_SESSION['cartitems'][$key][1] += $quantity; 
        } 
       } else { 
        $_SESSION['cartitems'][$key][1] += $quantity; 
       } 
      } 
      // Woot, we found it, so we can update it 
      $found = true; 
      break; 
     } 
    } 
} 
// If it wasn't found, we can add it as a new item. This has been fact checked already 
if(!$found) { 
    $_SESSION['cartitems'][] = array($itemid, $quantity); 
} 
Смежные вопросы