Почему бы не создать еще один свернутый массив внутри $allgroupResult
для каждой категории, имея такую структуру:
array(1) {
[0] =>
array(4) {
'category_code' =>
string(13) "category_code"
'category_name' =>
string(13) "category_name"
'category_desc' =>
string(13) "category_desc"
'skus' =>
array(3) {
[0] =>
string(4) "sku1"
[1] =>
string(4) "sku2"
[2] =>
string(4) "sku3"
}
}
}
, и тогда вы можете просто сделать count($item['skus'])
всякий раз, когда вам нужно получить количество продуктов в каждой категории. Чтобы сделать это, попробуйте следующую модификацию вашего цикла foreach
:
foreach($prices->groups as $group){
$groupItem = array();
$groupItem["category_code"] = $group->category_code;
$groupItem["category_name"] = $group->category_name;
$groupItem["category_desc"] = $group->category_desc;
$groupItem["skus"] = array();
foreach($group->skus as $sku){
$skuItem = array();
$skuItem["item_code"] = $sku->sku_info->item->item_code;
$skuItem["identifier"] = $sku->sku_info->identifier;
foreach($sku->prices as $price => $amount){
$skuItem[] = $amount;
}
$skuItem[] = strip_tags(html_entity_decode($sku->sku_info->item->desc));
foreach ($sku->sku_info->details as $details) {
$skuItem[] = $details->details1;
$skuItem[] = $details->details2;
$skuItem[] = $details->details3;
}
$groupItem["skus"][] = $skuItem;
}
$allgroupResult[] = $groupItem;
}
Можно проверить UsageMode LicenseManager, чтобы проверить, находится ли код во время проектирования или нет.
Система. ComponentModel. LicenseManager. UsageMode == система. ComponentModel. LicenseUsageMode. Время проектирования
Вот быстрый пример:
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace Test
{
public class ComponentClass : Component
{
public ComponentClass()
{
MessageBox.Show("Runtime!");
}
}
}
Когда этот компонент добирается, добавляют к Вашей форме в разработчике, Вы будете immediatly получать окно сообщения.
Для предотвращения этого, можно добавить простое, если оператор, чтобы проверить, не находится ли код во время проектирования
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace Test
{
public class ComponentClass : Component
{
public ComponentClass()
{
if (LicenseManager.UsageMode != LicenseUsageMode.Designtime)
{
MessageBox.Show("Runtime!");
}
}
}
}
После добавления, если оператор, messagebox больше не появляется, когда компонент добавляется к форме через разработчика.
Я надеюсь, что это помогает.
- jeremy
Существуют некоторые вещи, которые Вы не должны делать с разработчиком. У меня нет веского доказательства, но я нашел, что разработчик Windows Forms ненавидит его, когда Вы убираете конструктора по умолчанию из него. Просто идите вперед и создайте новые перегрузки, но оставьте пустого конструктора на месте.
Также постарайтесь не делать Form_Load
события в базовых классах Вы наследовались.
Вы также можете использовать это, чтобы проверить, запускает ли Visual Studio Designer код:
public static bool DesignMode
{
get { return (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv"); }
}
Затем в Form_Load:
if (!DesignMode)
{
// Run code that breaks in Visual Studio Designer (like trying to get a DB connection)
}
Однако это менее элегантно, чем использование LicensManager .UsageMode
, но он работает (пока Microsoft не изменит имя процесса, под которым работает Visual Studio).