使用PHP创建每个元素的组合的最佳方法

时间:2018-09-15 16:11:31

标签: php cartesian-product

这是我的数组:

[options] => Array
    (
        [1] => Array
            (
                [0] => Red
                [1] => Yellow
                [2] => Blue
                [3] => Green
            )

        [2] => Array
            (
                [0] => 28
                [1] => 30
                [2] => 32
                [3] => 34
            )

        [3] => Array
            (
                [0] => Short Neck
                [1] => Full Neck
                [2] => Round Neck
            )

        [5] => Array
            (
                [0] => Bodycon
                [1] => Empire Waist
                [2] => High-Low
            )

    )

想要创建这样的字符串:
Red-28-Short Neck-Bodycon
Red-28-Short Neck-Empire腰围
红色28短脖子高低

Red-28-Full Neck-Bodycon
红色28全颈帝国腰
红色28全颈高低

红28圆脖子上的健美操
28圆领红色帝国腰围
红色28圆脖子高低

红色30短脖子上的Bodycon
红色30短颈帝国腰
红色30短脖子高低

红色30-全颈Bodycon
红色30全颈帝国腰
红色30全颈高低

红色30字形脖子防弹衣
红色30圆脖子帝国腰围
红色30圆脖子-高-低

等等...

对于每个值

谢谢

3 个答案:

答案 0 :(得分:1)

您可以使用递归函数来构建结果数组,例如:

function combine($arr) {
    if (count($arr) === 1) {
        return array_shift($arr);
    } 
    $items = array_shift($arr);

    $data = [];
    foreach ($items as $item) {
        foreach (combine($arr) as $value) {
            $data[] = $item . ' ' . $value;
        }
    } 
    return $data;
}

并使用示例:

$items = [
    [            
        'Red',
        'Yellow',
        'Blue',
        'Green',
    ],
    [
        28,
        30,
        32,
        34
    ],
    [
        'Short Neck',
        'Full Neck',
        'Round Neck'
    ],
    [
        'Bodycon',
        'Empire Waist',
        'High-Low'
    ]
];

$result = combine($items);

答案 1 :(得分:0)

您可以在注释中的线程中使用cartesian()函数,也可以使用简单的例程,例如:

$join = [];
foreach( $myarray[ 'options' ] as $block ) :

    foreach( $block as $i => $value ) :

        $join[ $i ][] = $value;

    endforeach;

endforeach;

foreach( $join as $string ) :

    echo implode( '-', $string ) . '<br>';

endforeach;

输出:

Red-28-Short Neck-Bodycon
Yellow-30-Full Neck-Empire Waist
Blue-32-Round Neck-High-Low
Green-34

不太漂亮,但是应该在单个用例中完成工作。

答案 2 :(得分:0)

给出您的数组:

$items = [
    1=>[            
        'Red',
        'Yellow',
        'Blue',
        'Green',
    ],
    2=>[
        28,
        30,
        32,
        34
    ],
    3=>[
        'Short Neck',
        'Full Neck',
        'Round Neck'
    ],
    5=>[
        'Bodycon',
        'Empire Waist',
        'High-Low'
    ]
];

这是最简单,最省钱的方法

$items=array_values($items);
$result=[];


foreach($items[0] as $k1=>$v1){
    foreach($items[1] as $k2=>$v2){
        foreach($items[2] as $k3=>$v3){
            foreach($items[3] as $k4=>$v4){
                $result[]=$v1.' '.$v2.' '.$v3.' '.$v4;
            }
        }
    }   
}

如果您想从上面的代码中删除一个步骤,则可以使用数组

$result=[];


    foreach($items[1] as $k1=>$v1){
        foreach($items[2] as $k2=>$v2){
            foreach($items[3] as $k3=>$v3){
                foreach($items[5] as $k4=>$v4){
                    $result[]=$v1.' '.$v2.' '.$v3.' '.$v4;
                }
            }
        }   
    }

请注意,我们删除了array_values

这些代码输出一个144个条目的数组,这些数组代表按预期顺序的所有组合。