22 $variationalAttributes = $this->combineVariationalAttributes($usedProductAttributes);
24 $attributesCount = count($variationalAttributes);
25 if ($attributesCount === 0) {
30 $currentVariation = array_fill(0, $attributesCount, 0);
31 $variationalAttributes = array_reverse($variationalAttributes);
32 $lastAttribute = $attributesCount - 1;
34 $this->incrementVariationalIndex($attributesCount, $variationalAttributes, $currentVariation);
35 if ($currentVariation[$lastAttribute] >= count($variationalAttributes[$lastAttribute][
'values'])) {
39 $filledVariation = [];
40 for ($attributeIndex = $attributesCount; $attributeIndex--;) {
41 $currentAttribute = $variationalAttributes[$attributeIndex];
42 $currentVariationValue = $currentVariation[$attributeIndex];
43 $filledVariation[$currentAttribute[
'id']] = $currentAttribute[
'values'][$currentVariationValue];
46 $variations[] = $filledVariation;
47 $currentVariation[0]++;
59 private function combineVariationalAttributes($usedProductAttributes)
61 $variationalAttributes = [];
62 foreach ($usedProductAttributes as
$attribute) {
64 foreach (
$attribute[
'options'] as $valueInfo) {
66 if (isset($priceData[
'value_index']) && $priceData[
'value_index'] == $valueInfo[
'value']
67 && (!isset($priceData[
'include']) || $priceData[
'include'])
69 $valueInfo[
'price'] = $priceData;
76 return $variationalAttributes;
87 private function incrementVariationalIndex($attributesCount, $variationalAttributes, &$currentVariation)
89 for ($attributeIndex = 0; $attributeIndex < $attributesCount - 1; ++$attributeIndex) {
90 if ($currentVariation[$attributeIndex] >= count($variationalAttributes[$attributeIndex][
'values'])) {
91 $currentVariation[$attributeIndex] = 0;
92 ++$currentVariation[$attributeIndex + 1];
getVariations($usedProductAttributes)