函数对数组中的第一项没有影响

时间:2014-01-31 15:06:50

标签: php arrays session shopping-cart

我有一个功能可以改变产品的数量并将其存储在会话中。

public static function updateProduct($product_code, $newQty)
{   
    foreach ($_SESSION["products"] as $cart_itm) //loop through session array
    {
        if($cart_itm["code"] == $product_code) //the item exist in array
        {
            $product[] = array('name'=>$cart_itm["name"], 'code'=>$cart_itm["code"], 'qty'=>$newQty);
        }
        else
        {
            //item doesn't exist in the list, just retrieve old info and prepare array for session var
            $product[] = array('name'=>$cart_itm["name"], 'code'=>$cart_itm["code"], 'qty'=>$cart_itm["qty"]);
        }
    }
    //found user item in array list, and increased the quantity
    $_SESSION["products"] = $product;
return;
}

但如果阵列中有两个或更多产品,则该功能仅适用于最后添加的产品。 有人有想法吗?

PS:将产品添加到购物车的功能正常。但是没有任何重大差异。

评论代码:

$cart_items = 0;

foreach ($_SESSION["products"] as $cart_itm)
{       
echo '<input type="hidden" name="product_code" value="'.$product_code.'" />';           
$cart_items ++;
}

if(isset($_SESSION["products"]))
{
    echo '<form method="post" name="updateProduct">';

    echo '<ul>';
    $cart_items = 0;

    foreach ($_SESSION["products"] as $cart_itm)
    {
       $product_code = $cart_itm["code"];
        // get the product_name
        $db = JFactory::getDbo();
        $query = $db->getQuery(true);
        $query->select($db->quoteName('product_name'))
         ->from($db->quoteName('#__osmaf_products'))
         ->where($db->quoteName('product_code') . ' = '. $db->quote($product_code));
        $db->setQuery($query);
        $result = $db->loadRow();

        echo '<li class="cart-itm">';
        echo '<h4>'.$result['0'].' (Artikelnr.:'.$product_code.')</h4>';
        echo '<label style="display:inline">Menge: </label><input type="number" style="width:50px;margin-top:9px" name="newqty" value="'.$cart_itm["qty"].'" />';
        echo ' <input type="submit" class="btn btn-primary" name="updateProduct" value="&#x21bb;" />';
        echo '<input type="hidden" name="product_code" value="'.$cart_itm["code"].'" />';
        echo '</li>';
        $cart_items ++;

    }
}

当我现在每次发送表单时,即使我想要更新哪个产品,最后一个产品的姓氏和数量也会发送到该功能。

4 个答案:

答案 0 :(得分:0)

我改变了你的代码

public static function updateProduct($product_code, $newQty)
{   
    foreach ($_SESSION["products"] as $cart_item_id => $cart_itm) {
        if($cart_itm["code"] == $product_code) {
            $_SESSION["products"][$cart_item_id]["qty"] = $newQty;
        }

    }
}

试试吧。

答案 1 :(得分:0)

我认为通过这种方式,您不会在$ product数组中添加项目,但每次重新启动它时。我建议改为使用array_push

答案 2 :(得分:0)

为什么不简单地更新数组,而不是复制所有内容?

请注意& $cart_itempublic static function updateProduct($product_code, $newQty) { foreach ($_SESSION["products"] as &$cart_itm) //loop through session array, but as reference { if($cart_itm["code"] == $product_code) //the item exist in array { $cart_item["qty"] = $newQty; //assuming $product_code unique, so we are done. return; } } } 作为参考而非另一个副本。

{{1}}

答案 3 :(得分:0)

正如评论中所讨论的那样,您将产品代码存储在具有相同名称的隐藏循环中(非数组)。而且,$product_code未定义。即使之前定义,也会存储相同的值。因此,您必须将所有产品代码存储为数组,如下所示

foreach ($_SESSION["products"] as $cart_itm)
{       
echo '<input type="hidden" name="product_code[]" value="'.$cart_itm["code"].'" />';           
$cart_items ++;
}