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

Best way to create combination of each element using PHP

这是我的数组:

[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
            )

    )

想要创建这样的字符串:
红28-短领-紧身衣
红28-短领-帝国腰
红28-短领-高-低

红28-全领-紧身衣
红28-满领-帝国腰
红28-全领-高-低

红色-28圆领-紧身衣
红色-28圆颈-帝国腰
红色-28-圆领-高-低

红色-30-短领-紧身衣
红色-30-短领-帝国腰
红-30-短领-高-低

红色-30-全领-紧身衣
红色-30-满领-帝国腰
红色-30-全领-高-低

红色-30圆颈-Bodycon
红色-30圆颈-帝国腰
红色-30-圆领-高-低

等等...

对于每个值

谢谢

您可以在评论中使用线程中的 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

不是很漂亮,但应该可以完成单个用例的工作。

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

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

给定你的数组:

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