我用PHP写作。
我想要做的是像Magento2中的可配置产品或Woocommerce中的可变产品。我要求用户输入产品的属性,如颜色,大小等。
将每个属性视为包含其中属性的属性类别,例如“color”将具有“red”,“green”,“blue”等属性。大小将具有“大”,“小”,“中等”等属性。
现在,我需要创建一个循环,它接受所有大小,颜色和其他选择的属性,并返回所有可能的配置。同时,由于用户可以添加或删除属性,因此未预定义要循环的属性数量。
例如,如果我有这个:
Color - - - - - - - - Size - - - - - - - - Shape
Red - - - - - - - - - Large - - - - - - - Square
Green - - - - - - - - Medium - - - - - - - Rounded
Blue - - - - - - - - Small - - - - - - - -
所以我必须拥有各种尺寸和形状的颜色:
Red - Large - Square
Red - Large - Rounded
Red - Medium - Square
Red - Medium - Rounded
Red - Small - Square
Red - Small - Rounded
与其他属性相同。
实现它的最佳做法是什么?
答案 0 :(得分:2)
你需要递归。
function getCombinations($attributes){
$combinations = [];
buildCombinationChain($attributes,0,[],$combinations);
// encode combinations to desired string format
$result = [];
foreach ($combinations as $combination) {
$result[] = implode(' - ', $combination);
}
return $result;
}
function buildCombinationChain($attributes,$index,$chain,&$output){
if($index>=count($attributes)){
// we have reached the last attribute, stop recursion and push the current chain to the output array
$output[] = $chain;
return;
}
foreach ($attributes[$index] as $attribute) {
$new_chain = $chain; // create a copy of the current chain
$new_chain[] = $attribute; // and add the current attribute to it
buildCombinationChain($attributes,$index+1,$new_chain,$output); // continue recursively on the next attribute group
}
}
$attributes = [
['Red', 'Green', 'Blue'],
['Large', 'Medium', 'Small'],
['Square', 'Rounded']
];
echo json_encode(getCombinations($attributes));