Несколько предметов в корзине PHP - PullRequest
2 голосов
/ 23 мая 2010

Я делаю корзину для покупок на PHP. Чтобы проверить, выбрал ли пользователь несколько продуктов, я поместил все в массив ($ contents). Когда я вывожу это, я получаю что-то вроде "14,14,14,11,10". Я хотел бы иметь что-то вроде "3 х 14, 1 х 11, 1 х 10". Какой самый простой способ сделать это? Я действительно понятия не имею, как это сделать.

Это самая важная часть моего кода.

<code>    $_SESSION["cart"] = $cart;

    if ( $cart ) {
        $items = explode(',', $cart);
        $contents = array();
        $i = 0;
        foreach ( $items as $item ) {
            $contents[$item] = (isset($contents[$item])) ? $contents[$item] + 1 : 1;
            $i++;
        }

        $smarty->assign("amount",$i);


        echo '<pre>';
        print_r($contents);
        echo '
';

Заранее спасибо.

Ответы [ 4 ]

5 голосов
/ 23 мая 2010

Почему бы не создать более надежную реализацию корзины?

Подумайте о том, чтобы начать с такой структуры данных:

$cart = array(
  'lines'=>array(
     array('product_id'=>14,'qty'=>2),
     array('product_id'=>25,'qty'=>1)
   )
);

или подобной.

Затем вы можете создать набор функций, которые работают со структурой корзины:

function addToCart($cart, $product_id, $qty){
   foreach($cart['lines'] as $line){
     if ($line['product_id'] === $product_id){
       $line['qty']  += $qty;
       return;
     }
   }
   $cart['lines'][] = array('product_id'=>product_id, 'qty'=>$qty);
   return;
}

Конечно, вы можете (и, возможно, должны) пойти дальше и объединить эту структуру данных и функции внабор классов.Тележки для покупок - отличное место, чтобы начать мыслить объектно-ориентированным способом.

1 голос
/ 17 октября 2011

Вы бы выиграли от использования многомерного массива для хранения ваших данных в более надежной структуре.

Например:

$_SESSION['cart'] = array(
  'lines'=>array(
     array('product_id'=>14,'quantity'=>2, 'item_name'=>'Denim Jeans'),
     ...
   )
);

Затем, чтобы добавить новые товары в корзину, вы можете просто сделать это:

$_SESSION['cart'][] = array('product_id'=45,'quantity'=>1, 'item_name'=>'Jumper');
1 голос
/ 23 мая 2010

Встроенная функция array_count_values ​​ может выполнять эту работу.

например:

<?php
$items = array(14,14,14,11,10);
var_dump(array_count_values($items));
?>

Выходы:

array(3) {
  [14]=>
  int(3)
  [11]=>
  int(1)
  [10]=>
  int(1)
}
0 голосов
/ 23 ноября 2012

Когда вы позволяете пользователю добавить элемент, вам нужно добавить его в нужную позицию в массиве. Если идентификатор продукта уже существует в массиве, его необходимо обновить. Также всегда будьте осторожны с пользователями, пытающимися ввести ноль или минус!

...