Корзина в PHP не работает соответственно

Я боролся с PHP-кодом для корзины.

В частности, функция добавления элемента таким образом, чтобы было легко иметь элементы с несколькими заказами.

Вот что у меня есть, но, похоже, это не работает для добавления второго элемента:

function addtocart($pid,$q)
    {
        if($pid<1 or $q<1) return;
        if (is_array($_SESSION['cart']))
            {
                $max=count($_SESSION['cart']);
                $_SESSION['cart'][$max]['itemId']=$pid;
                $_SESSION['cart']['itemId']['qty']= $_SESSION['cart']['itemId']['qty'] + $q;
                $max=count($_SESSION['cart']);
                echo "SECOND";
            }
            else
            {
                $_SESSION['cart']=array();
                $_SESSION['cart'][0]['itemId']=$pid;
                $_SESSION['cart'][0]['qty'] = $q;
                $max=count($_SESSION['cart']);
            }
    }

Какие-либо предложения?

Спасибо


person samyb8    schedule 21.02.2013    source источник
comment
Что вы имеете в виду, говоря, что не работаете над вторым пунктом? Это перезаписывает первый элемент? Или просто не добавляется второй элемент?   -  person TddOrBust    schedule 21.02.2013


Ответы (3)


Вы слишком все усложняете.

function addtocart($pid,$q) {
    if($pid<1 or $q<1) return;

    // has the main 'cart' array been set up in session yet? If not, do it
    if (!array_key_exists('cart', $_SESSION) || !is_array($_SESSION['cart']))
        $_SESSION['cart']=array();

    // has this item been added to the cart yet? If not, do it (0 qty)
    if (!array_key_exists($pid, $_SESSION['cart'])) {
        $_SESSION['cart'][$pid] = array(
            'itemId'=>$pid,
            'qty'=>0
        );  
    }

    // add the requested quantity of items to the cart
    $_SESSION['cart'][$pid]['qty'] = $_SESSION['cart'][$pid]['qty'] + $q;
}

При первом использовании этой функции для добавления элемента она установит правильную запись в массиве сеанса. Любое последующее использование функции для добавления одного и того же элемента будет увеличивать ключ qty. Когда все сказано и сделано, у вас будет что-то вроде этого:

array(
    '54'=>array(
        'itemId'=>54,
        'qty'=>4
    ),
    '99'=>array(
        'itemId'=>99,
        'qty'=>2
    ),  
)

Документация

person Chris Baker    schedule 21.02.2013
comment
Какой смысл в том, что избыточное значение идентификатора продукта является ключом, а также подзначением массива? - person Dutchie432; 21.02.2013
comment
Нет технической причины; подготовка помещения для будущего расширения, я предполагаю. Не зная варианта использования, я не хотел отклоняться от структуры, которую он установил в ОП. Это не повредит, и если есть какие-то обстоятельства, при которых вы получаете только значения, вы не получаете плоский массив чисел без контекста. - person Chris Baker; 21.02.2013
comment
Как бы я повторил pid и qty? Я пробую эти $pid=$_SESSION['cart'][$i]['itemId']; и $q=$_SESSION['cart'][$i]['qty'];, но они пустые... - person samyb8; 22.02.2013
comment
Что такое $i? foreach ($_SESSION['cart'] as $item) { print $item['itemId'].': '.$item['qty']; } - person Chris Baker; 22.02.2013
comment
Когда я удаляю товар, дважды добавленный в корзину, я не вижу уменьшения числа. Я удаляю с помощью for и вот так: unset($_SESSION['cart'][$i]);. Это нормально? - person samyb8; 22.02.2013
comment
Если вы сделаете это, вы удалите все предметы этого типа из корзины. Вам нужно передать itemId в сценарий, тогда вы должны сделать это: $_SESSION['cart'][$itemId]['qty']--; для уменьшения на 1 или $_SESSION['cart'][$itemId]['qty'] = $_SESSION['cart'][$itemId]['qty'] - $qty; для уменьшения на $qty - person Chris Baker; 22.02.2013
comment
Привет, у меня было следующее предложение: $max=count($_SESSION['cart']); для подсчета товаров в корзине. Но даже если я удалю элементы, как вы сказали, счет останется прежним... - person samyb8; 26.02.2013
comment
Чтобы подсчитать общее количество товаров в корзине, вам придется зациклить массив и сложить все поля «количество». $total = 0; foreach ($_SESSION['cart'] as $item) { $total = $total + $item['qty']; } - person Chris Baker; 26.02.2013
comment
На самом деле я думаю, что удаление элемента, которым вы поделились выше, может быть не идеальным? Это уменьшает количество, но существенно оставляет запись для товара. Итак, когда у меня есть 1 товар в корзине, я удаляю его, а затем добавляю другой товар, я вижу корзину = 2 (1 товар с кол-во = 0 и 1 товар с кол-во = 1) - person samyb8; 26.02.2013
comment
... затем вы добавляете некоторую логику, чтобы полностью удалить запись массива, если количество равно 0. Это ваш руководитель проекта, работайте с ним. Я не пытаюсь думать о каждом аспекте, я просто ответил на ваш конкретный вопрос. if ($_SESSION['cart'][$itemId]['qty'] == 0) { unset($_SESSION['cart'][$itemId]); } - person Chris Baker; 26.02.2013

Ваша функция может быть упрощена до чего-то вроде этого.

function addtocart($pid,$q)
    {
        if($pid<1 or $q<1) return;

        //if the cart is not defined, define it
        if (!is_array($_SESSION['cart'])) $_SESSION['cart']=array();

        //See if an arry item for the part number exists, or add it
        if (!$_SESSION['cart'][$pid]) 
            $_SESSION['cart'][$pid]=$q;
        else
            $_SESSION['cart'][$pid]+=$q;
    }

Чтобы потом прочитать...

foreach($_SESSION['cart'] as $item=>$qty){
    echo $item.': '.$qty;
}

Этот метод хорош тем, что если вы добавите один и тот же товар дважды, количество будет суммироваться.

person Dutchie432    schedule 21.02.2013

Может быть, это поможет вам. Второй индекс должен быть $max, а не 'itemId'.

function addtocart($pid,$q)
    {
        if($pid<1 or $q<1) return;
        if (is_array($_SESSION['cart']))
            {
                $max=count($_SESSION['cart']);
                $_SESSION['cart'][$max]['itemId']=$pid;
                $_SESSION['cart'][$max]['qty']= $_SESSION['cart'][$max]['qty'] + $q;
                $max=count($_SESSION['cart']);
                echo "SECOND";
            }
            else
            {
                $_SESSION['cart']=array();
                $_SESSION['cart'][0]['itemId']=$pid;
                $_SESSION['cart'][0]['qty'] = $q;
                $max=count($_SESSION['cart']);
            }
    }
person Christian Strempfer    schedule 21.02.2013