protected function generateCartesian(Product $product) { $attributeOptions = $product->getAttributeOptions(); $attributesArray = $attributeOptions->groupBy('attribute_group_id')->map(function (Collection $attributeOptionsByGroup) { return $attributeOptionsByGroup->pluck('id'); })->toArray(); $result = []; while (list($key, $values) = each($attributesArray)) { if (empty($values)) { continue; } if (empty($result)) { foreach ($values as $value) { $result[] = [$key => $value]; } } else { $append = []; foreach ($result as &$product) { $product[$key] = array_shift($values); $copy = $product; foreach ($values as $item) { $copy[$key] = $item; $append[] = $copy; } array_unshift($values, $product[$key]); } $result = array_merge($result, $append); } } foreach ($result as &$array) { sort($array); } return collect($result); }