una rellenar programacion programa matriz matrices hacer ejercicios ejemplos como php arrays count

php - rellenar - Cómo almacenar cantidades de productos en una matriz



matriz en c (5)

Tengo una matriz de datos que totaliza todos los artículos en el carrito para todos los productos como un solo número.

He estado tratando de encontrar una manera de obtener un recuento de la matriz de datos () todos los diferentes totales de todos los diferentes artículos en el carrito y tenerlos presentados en coma de mi capa de datos separados. Espero que tenga sentido.

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);

Lo anterior volverá:

dataLayer = [{"visitorLoginState": "Logged out", "visitorType": "NOT LOGGED IN", "visitorLifetimeValue": 0, "visitorExistingCustomer": "No", "u1": 2, "u2": ["889623392590 "," 889623135517 "]

Muestra un total de 2 productos para la variable U1 y los dos sku para la variable u2 en la matriz de datos.

Si tengo varios productos para el primer sku quiero que separe las cantidades. es decir, "u1":1,1,3

¿Utilizaría array_sum o algún tipo de matriz multidimensional para adquirir mis necesidades?


Si tengo varios productos para el primer sku quiero que separe las cantidades. es decir, "u1": 1,1,3

No está del todo claro para mí la relación entre sku y el producto y qué variables en su matriz se refieren a cuál. Hago las siguientes presunciones: 1) Un product es equivalente a un $items 2) Un sku es un $itemIds[] único de $itemIds[]

Utilizo la clave de matriz como una forma sencilla de realizar un seguimiento de cada sku único y el valor para realizar un seguimiento del recuento de productos para el 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); } }


¿Qué tal algo como ...

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);


Creo que estas mezclando cosas.

En un sistema simple deberías tener:

  • Orden tiene una matriz de artículos ordenados

  • Cada OrderedItem almacena ProductObject y OrderedQuantity

  • Y el ProductObject contiene todos los datos del producto.

Por lo tanto, en su ejemplo, en lugar de contar SKU, debe tener el campo $ artículo-> cantidad y debe trabajar con eso cuando agregue / elimine / edite el contenido de la orden.


Mirando el código parece que solo se devolverá un producto a medida que se sobrescriba la variable $parent para obtener un primer artículo. He agregado una nueva variable llamada $itemProductCounts , que se devolverá a la matriz de salida $data como itemProductCounts . Sospecho que siempre será igual a uno.

<?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;

Con todo lo dicho, el código anterior debería $itemProductCounts[$item->getSku()] = count($parent); a lo que necesita, debe reemplazar la línea $itemProductCounts[$item->getSku()] = count($parent); con la matriz correcta con los recuentos de productos para ese SKU.


Parte del problema con sus datos aquí es que todo lo que se encuentra en un $item está oculto detrás de un elemento de acceso. En lugar de crear multitud de matrices, sugeriría crear un nuevo objeto para alojar la información o simplemente modificar el $item directamente.

Sin embargo, ensuciar directamente con el objeto tiene el riesgo de que usted use accidentalmente un nombre de variable que existe en un ámbito protected o private , por lo que probablemente sea mejor usar el suyo, así.

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); }

La mayoría de estos tipos de funciones de PHP funcionarán también en sus otros tipos de datos si desea realizar el conteo y la agrupación en clústeres y, a medida que lo señale, también puede ejecutar operaciones de suma sobre ellas si lo desea.

Referencias de manipulación de matrices de PHP: array_column , array_count_values , array_values , array_values , array_unique , array_keys .

Como barra lateral, Mage_Sales_Model_Quote_Item tiene un método getParentItemId() disponible y un método getQtyOptions , que devuelve tanto la cantidad como el modelo del producto.