Я пишу сайт электронной коммерции, и мне нужен хороший способ рассчитать варианты продукта. На сайте есть продукты, продукты могут иметь много групп опций, группы опций могут иметь множество опций.
Таким образом, у продукта с футболкой есть 3 группы опций и опции:
Размер: маленький, средний, большой,
Цвет: красный, синий, желтый, черный,
Материал: хлопок, нейлон,
который создает: маленький красный хлопок, маленький красный нейлон, маленький синий хлопок, маленький синий нейлон и т. д. и т. д.
Я знаю, что приведенный ниже сценарий работает, но также его можно оптимизировать. Может ли кто-нибудь предоставить лучший рабочий пример этого? Это должно быть возможно и с использованием рекурсии ... но я нахожусь в ментальном блоке.
if(count($option_groups) > 1)
{
// start the variants up
foreach($option_groups[0]->get_options() as $option)
{
$variants[] = array($option);
}
// go through every other option group to make combos
for($x = 1; $x < count($option_groups); $x++)
{
$combos = array();
foreach($variants as $variant)
{
$new = array();
foreach($option_groups[$x]->get_options() as $option)
{
$tmp = $variant;
$tmp[] = $option;
$new[] = $tmp;
}
$combos[] = $new;
}
$variants = array();
foreach($combos as $combo)
{
foreach($combo as $tmp)
{
$variants[] = $tmp;
}
}
}
}
Это не очень чувствительно ко времени, но я бы хотел иметь более обслуживаемый фрагмент кода, это довольно грубо.
Также есть ли у этой проблемы (я чувствую, что это не оригинальная проблема, многие тележки так и поступают)? Я ничего не подтягивал в гугле по этой проблеме.
РЕДАКТИРОВАТЬ. Это то, к чему я пришел, он основан на решении profphp, но поддерживает мои объекты вместо того, чтобы давать мне варианты для каждого варианта, объединенные в строку. Все благодаря Profitphp!
private function _possible_combos($groups, $prefix = array())
{
$result = array();
$group = array_shift($groups);
foreach($group->get_options() as $selected)
{
if($groups)
{
$tmp = $prefix;
$tmp[] = $selected;
$result = array_merge($result, $this->_possible_combos($groups, $tmp));
}
else
{
$tmp = $prefix;
$tmp[] = $selected;
$result[] = $tmp;
}
}
return $result;
}
sequence [["small", "medium", "large"], ["red", "blue", "yellow", "black"], ["cotton", "nylon"]] = [["small","red","cotton"],["small","red","nylon"],["small","blue","cotton"],["small","blue","nylon"], {- and a bunch more ... -}]
- person Daniel Wagner   schedule 07.09.2011