循环遍历嵌套数组的最佳实践php

时间:2018-04-22 12:58:05

标签: php loops

我用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

与其他属性相同。

实现它的最佳做法是什么?

1 个答案:

答案 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));