如何在数组中存储产品数量

时间:2016-11-08 23:42:33

标签: php arrays count

我有一个数据数组,将所有产品的购物车中的所有商品总计为一个数字。

我一直试图找出一种方法来获取数据数组count()购物车中所有不同项目的所有不同总数,并将它们以我的数据层逗号分隔。我希望这是有道理的。

if ($order->getId()) {
    $items = $order->getAllVisibleItems();
    $itemIds = array();
    $itemNames = array();
    $itemPrices = array();
    $itemMargins = array();
    $itemTypes = array();
    $itemGenders = array();
    $itemSports = array();
    $itemCategoryIds = array();
    $itemCategoryNames = array();
    /** @var Mage_Sales_Model_Quote_Item $item */
    foreach ($items as $item) {

        // Get the parent item - it is NOT included in the quote due to
        // customizations made by the OrganicInternet module for simple
        // product pricing. So I had to come up with another way to get it.
        $options = $item->getProductOptions();
        $parent = $item->getProduct();
        if (array_key_exists('info_buyRequest', $options)) {
            if (array_key_exists('cpid', $options['info_buyRequest'])) {
                $parentId = $options['info_buyRequest']['cpid'];
                $parent = Mage::getModel('catalog/product')->getCollection()
                    ->addAttributeToSelect('name')
                    ->addAttributeToSelect('season')
                    ->addAttributeToSelect('gender')
                    ->addAttributeToSelect('sport')
                    ->addAttributeToFilter('entity_id', $parentId)
                    ->getFirstItem();
            }
        }

        $itemIds[] = $item->getSku();
        $itemNames[] = $parent->getName();
        $itemPrices[] = $item->getBasePrice() ?: 0;
        $itemMargins[] = $this->_calculateMargin($parent, null, $item);
        $itemTypes[] = $parent->getAttributeText('season');
        $itemGenders[] = $parent->getAttributeText('gender');
        $itemSports[] = $parent->getAttributeText('sport') ?: 'Other';
        $categories = $this->_getAllCategoryIdsAndNames($item->getProduct());
        $itemCategoryIds[] = $categories['id'];
        $itemCategoryNames[] = $categories['name'];
    }

    // # Products

    $data['u1'] = count($items);

以上将返回:

  dataLayer = [{" visitorLoginState":"已注销"," visitorType":"未登录"," visitorLifetimeValue&#34 ;:0," visitorExistingCustomer":"否"" U1":2" U2":[" 889623392590&#34 ;," 889623135517"]

它显示了U1变量的总共2个产品和数据数组中u2变量的两个sku。

如果我有第一个sku的多个产品,我希望它分开数量。即.. "u1":1,1,3

我会使用array_sum或某种类型的多维数组来满足我的需求吗?

5 个答案:

答案 0 :(得分:6)

  

如果我有第一个sku的多个产品,我希望它分开   数量。即..“u1”:1,1,3

我不完全清楚sku和产品之间的关系以及数组中哪些变量引用哪些变量。我做出以下假设: 1)product相当于一个$items元素 2)sku是唯一的$itemIds[]

我使用数组键作为跟踪每个唯一sku的简单方法,并使用值来跟踪sku的产品数量。

if ($order->getId()) {
    $items = $order->getAllVisibleItems();
    $itemIds = array();
    $itemNames = array();
    $itemPrices = array();
    $itemMargins = array();
    $itemTypes = array();
    $itemGenders = array();
    $itemSports = array();
    $itemCategoryIds = array();
    $itemCategoryNames = array();

    // My addition (UPDATE: fixed to the correct variable name)
    $uniqueItemIds = array();

    /** @var Mage_Sales_Model_Quote_Item $item */
    foreach ($items as $item) {

        // Get the parent item - it is NOT included in the quote due to
        // customizations made by the OrganicInternet module for simple
        // product pricing. So I had to come up with another way to get it.
        $options = $item->getProductOptions();
        $parent = $item->getProduct();
        if (array_key_exists('info_buyRequest', $options)) {
            if (array_key_exists('cpid', $options['info_buyRequest'])) {
                $parentId = $options['info_buyRequest']['cpid'];
                $parent = Mage::getModel('catalog/product')->getCollection()
                    ->addAttributeToSelect('name')
                    ->addAttributeToSelect('season')
                    ->addAttributeToSelect('gender')
                    ->addAttributeToSelect('sport')
                    ->addAttributeToFilter('entity_id', $parentId)
                    ->getFirstItem();
            }
        }
        // *******************************
        // My addition / changes
        $sku = $item->getSku();
        $itemIds[] = $sku;        // I don't use this but keep $itemIds for compatibility            

        // use the array key to track counts for each sku
        if (!isset($uniqueItemIds[$sku])){
            $uniqueItemIds[$sku] = 1;   // UPDATE: fixed to start at 1 not 0
        } else {
            $uniqueItemIds[$sku]++;
        }
        // *******************************
        $itemNames[] = $parent->getName();
        $itemPrices[] = $item->getBasePrice() ?: 0;
        $itemMargins[] = $this->_calculateMargin($parent, null, $item);
        $itemTypes[] = $parent->getAttributeText('season');
        $itemGenders[] = $parent->getAttributeText('gender');
        $itemSports[] = $parent->getAttributeText('sport') ?: 'Other';
        $categories = $this->_getAllCategoryIdsAndNames($item->getProduct());
        $itemCategoryIds[] = $categories['id'];
        $itemCategoryNames[] = $categories['name'];
    }

    // show # Products
    // "u1":1,1,3 NOTE: this should be a string => "u1":"1,1,3"
    $data['u1'] = "";
    foreach ($uniqueItemIds as $key => $val)
        // show unique skus in u2
        $data['u2'][] = $key;
        // show counts for each sku in u1
        if (strlen($data['u1'] == 0)){
            $data['u1'] = (string)$value;
        } else {
           $data['u1'] .= ("," . $value);
        }            
    }

答案 1 :(得分:1)

怎么样......

if ($order->getId()) {
    .....
    .....
    .....
    /** @var Mage_Sales_Model_Quote_Item $item */
    $sku_based_array = array();

    foreach ($items as $item) {
        ......
        ......
        ......
        $categories = $this->_getAllCategoryIdsAndNames($item->getProduct());
        $itemCategoryIds[] = $categories['id'];
        $itemCategoryNames[] = $categories['name'];

        if (isset($sku_based_array[$item->getSku()])) {
            $sku_based_array[$item->getSku()] = $sku_based_array[$item->getSku()]++;
        } else {
            $sku_based_array[$item->getSku()] = 1;
        }
    }

    // # Products

    $data['u1'] = array_values($sku_based_array);

答案 2 :(得分:1)

此处数据的部分问题是$item中的所有内容都隐藏在访问者后面。我建议创建一个新对象来存储信息,或者直接修改$item,而不是创建大量数组。

直接与对象混淆可能会意外地使用protectedprivate范围内存在的变量名称,因此最好使用自己的变量名称,如此。

if ($order->getId()) {
    $items = $order->getAllVisibleItems();

    // only need one array, no need for all data points to have their own
    $myItems = [];

    /** @var Mage_Sales_Model_Quote_Item $item */
    foreach ($items as $item) {
        // basic shell
        $myItem = [];

        // get $options and $parent
        // ...

        // build your own data object
        $myItem['sku'] = $item->getSku();
        $myItem['name'] = $parent->getName();
        $myItem['price'] = $item->getBasePrice() ?: 0;
        $myItem['margin'] = $this->_calculateMargin($parent, null, $item);
        $myItem['type'] = $parent->getAttributeText('season');
        $myItem['gender'] = $parent->getAttributeText('gender');
        $myItem['sport'] = $parent->getAttributeText('sport') ?: 'Other';
        $categories = $this->_getAllCategoryIdsAndNames($item->getProduct());
        $myItem['categoryId'] = $categories['id'];
        $myItem['categoryName'] = $categories['name'];

        $myItems[] = $myItem;
    }

    // At this point, $myItems is manipulable by all the array_* functions

    // number of items e.g. 3
    $data['u1'] = count($myItems);
    // array of skus e.g. ["889623392590","889623392590","889623135517"]
    // note: can use objects for $myItem if on PHP 7 
    //       if you like -> notation better (in the loop)
    $skus = array_column($myItems, 'sku');
    // array of skus with counts e.g. ["889623392590" => 2, "889623135517" => 1]
    $skus_with_counts = array_count_values($skus);
    // just the counts (assuming indexes on other arrays must match) e.g. [2, 1]
    // note: might be useful if you want to keep the counts as an array in dataLayer
    $sku_counts = array_values($skus_with_counts);
    // if you want this as a comma-separated list for u1, e.g. "2,1"
    // note: will also work if you implode $skus_with_counts
    $data['u1'] = implode(',', $sku_counts);
    // get a list of unique SKUs (both will work), e.g. ["889623392590","889623135517"]
    $data['u2'] = array_unique($skus);
    $data['u2'] = array_keys($skus_with_counts);
}

如果你想进行计数和聚类,这些PHP函数中的大部分都可以用于其他数据类型,正如你所指出的,如果你愿意,也可以对它们运行求和操作。

PHP数组操作引用:array_columnarray_count_valuesarray_valuesimplodearray_uniquearray_keys

作为侧边栏,Mage_Sales_Model_Quote_Item确实有getParentItemId()方法和getQtyOptions方法,它同时返回数量和产品型号。

答案 3 :(得分:1)

查看代码看起来只会返回一个产品,因为$parent变量会被覆盖以获得第一个项目。我添加了一个名为$itemProductCounts的新变量,它将作为$data返回到输出itemProductCounts数组。我怀疑它总是等于一。

<?php
if ($order->getId()) {
    $items              = $order->getAllVisibleItems();
    $itemIds            = array();
    $itemNames          = array();
    $itemPrices         = array();
    $itemMargins        = array();
    $itemTypes          = array();
    $itemGenders        = array();
    $itemSports         = array();
    $itemCategoryIds    = array();
    $itemCategoryNames  = array();
    $itemProductCounts  = array();
    /** @var Mage_Sales_Model_Quote_Item $item */
    foreach ($items as $item) {

        // Get the parent item - it is NOT included in the quote due to
        // customizations made by the OrganicInternet module for simple
        // product pricing. So I had to come up with another way to get it.
        $options    = $item->getProductOptions();
        $parent     = $item->getProduct();
        if (array_key_exists('info_buyRequest', $options)) {
            if (array_key_exists('cpid', $options['info_buyRequest'])) {
                $parentId = $options['info_buyRequest']['cpid'];
                $parent = Mage::getModel('catalog/product')->getCollection()
                    ->addAttributeToSelect('name')
                    ->addAttributeToSelect('season')
                    ->addAttributeToSelect('gender')
                    ->addAttributeToSelect('sport')
                    ->addAttributeToFilter('entity_id', $parentId)
                    ->getFirstItem();
            }
        }

        $itemIds[]                          = $item->getSku();
        $itemNames[]                        = $parent->getName();
        $itemPrices[]                       = $item->getBasePrice() ?: 0;
        $itemMargins[]                      = $this->_calculateMargin($parent, null, $item);
        $itemTypes[]                        = $parent->getAttributeText('season');
        $itemGenders[]                      = $parent->getAttributeText('gender');
        $itemSports[]                       = $parent->getAttributeText('sport') ?: 'Other';
        $categories                         = $this->_getAllCategoryIdsAndNames($item->getProduct());
        $itemCategoryIds[]                  = $categories['id'];
        $itemCategoryNames[]                = $categories['name'];
        $itemProductCounts[$item->getSku()] = count($parent);
    }

    // # Products

    $data['u1'] = count($items);
    $data['itemProductCounts'] = $itemProductCounts;

说到这一切,上面的代码应该让你接近你需要的,你应该用正确的数组替换行$itemProductCounts[$item->getSku()] = count($parent);和该SKU的产品数。

答案 4 :(得分:-1)

我认为你在混合东西。

在一个简单的系统中你应该:

  • Order有一个OrderedItems数组

  • 每个OrderedItem都存储ProductObject和OrderedQuantity

  • ProductObject包含所有产品数据。

因此,在您的示例中,您必须拥有$ item-&gt;数量字段,而不是计算SKU,您应该在添加/删除/编辑订单内容时使用该字段。