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

问题描述 投票:1回答:3

这是我的数组:

[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-全颈 - 帝国腰 Red-28-Full-Neck-High-Low Red-28-Round Neck-Bodycon 红色28圆领帝国腰 红色28圆领高 - 低 Red-30-Short Neck-Bodycon 红色30短颈 - 帝国腰 红色30短颈高 - 低 Red-30-Full Neck-Bodycon 红色30全颈帝国腰 Red-30-Full-Neck-High-Low Red-30-Round Neck-Bodycon 红色30圆领帝国腰 红色30圆领 - 高低 等等... 对于每个值 谢谢

php cartesian-product
3个回答
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);

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

不是很漂亮,但应该为一个用例完成工作。


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个条目的数组,表示预期顺序中的所有组合。

© www.soinside.com 2019 - 2024. All rights reserved.