首页 > 解决方案 > 如何在 PHP 中生成具有不同元素编号的多个数组中的所有项目组合

问题描述

我试图在几个数组中找到所有项目的组合。数组的数量是随机的(可以是 2、3、4、5...)。每个数组中的元素数量也是随机的......

例如,我有 3 个数组:

$arrayA = array('A1','A2','A3',,'A4','A5','A6'); // (3 From here each time)

$arrayB = array('B1','B2','B3','B4','B5'); //(2 From here each time)

$arrayC = array('C1','C2'); // (1 From here each time)

我想生成一个数组 Like :

A1+A3+A5, B1+B5, C1

A1+A4+A5, B1+B4, C1

....

我试过这样,但我需要数组中的不同元素编号而不是每个数组中的一个元素。

<?php

$color = array('Blue','Red','Black','Green');
$size = array('L','M','S','XL','XXL');
$type  = array('Half selevs','full seleves');
$options = [
            $color,
            $size,
            $type,
        ];
$combinations = getCombinations($options);

print_r($combinations);

function getCombinations($options){ 

            $combinations = [[]];

            for ($count = 0; $count < count($options); $count++) {
                $tmp = [];
                foreach ($combinations as $v1) {
                    foreach ($options[$count] as $v2)
                        $tmp[] = array_merge($v1, [$v2]);

                }
                $combinations = $tmp;
            }

            return $combinations;
        }
?>

输出:

数组([0] => 数组([0] => 蓝色 [1] => L [2] => 半色)

[1] => Array
    (
        [0] => Blue
        [1] => L
        [2] => full seleves
    )

[2] => Array
    (
        [0] => Blue
        [1] => M
        [2] => Half selevs
    )

[3] => Array
    (
        [0] => Blue
        [1] => M
        [2] => full seleves
    )

[4] => Array
    (
        [0] => Blue
        [1] => S
        [2] => Half selevs
    )

[5] => Array
    (
        [0] => Blue
        [1] => S
        [2] => full seleves
    )

[6] => Array
    (
        [0] => Blue
        [1] => XL
        [2] => Half selevs
    )

[7] => Array
    (
        [0] => Blue
        [1] => XL
        [2] => full seleves
    )

[8] => Array
    (
        [0] => Blue
        [1] => XXL
        [2] => Half selevs
    )

[9] => Array
    (
        [0] => Blue
        [1] => XXL
        [2] => full seleves
    )

[10] => Array
    (
        [0] => Red
        [1] => L
        [2] => Half selevs
    )

[11] => Array
    (
        [0] => Red
        [1] => L
        [2] => full seleves
    )

[12] => Array
    (
        [0] => Red
        [1] => M
        [2] => Half selevs
    )

[13] => Array
    (
        [0] => Red
        [1] => M
        [2] => full seleves
    )

[14] => Array
    (
        [0] => Red
        [1] => S
        [2] => Half selevs
    )

[15] => Array
    (
        [0] => Red
        [1] => S
        [2] => full seleves
    )

[16] => Array
    (
        [0] => Red
        [1] => XL
        [2] => Half selevs
    )

[17] => Array
    (
        [0] => Red
        [1] => XL
        [2] => full seleves
    )

[18] => Array
    (
        [0] => Red
        [1] => XXL
        [2] => Half selevs
    )

[19] => Array
    (
        [0] => Red
        [1] => XXL
        [2] => full seleves
    )

[20] => Array
    (
        [0] => Black
        [1] => L
        [2] => Half selevs
    )

[21] => Array
    (
        [0] => Black
        [1] => L
        [2] => full seleves
    )

[22] => Array
    (
        [0] => Black
        [1] => M
        [2] => Half selevs
    )

[23] => Array
    (
        [0] => Black
        [1] => M
        [2] => full seleves
    )

[24] => Array
    (
        [0] => Black
        [1] => S
        [2] => Half selevs
    )

[25] => Array
    (
        [0] => Black
        [1] => S
        [2] => full seleves
    )

[26] => Array
    (
        [0] => Black
        [1] => XL
        [2] => Half selevs
    )

[27] => Array
    (
        [0] => Black
        [1] => XL
        [2] => full seleves
    )

[28] => Array
    (
        [0] => Black
        [1] => XXL
        [2] => Half selevs
    )

[29] => Array
    (
        [0] => Black
        [1] => XXL
        [2] => full seleves
    )

[30] => Array
    (
        [0] => Green
        [1] => L
        [2] => Half selevs
    )

[31] => Array
    (
        [0] => Green
        [1] => L
        [2] => full seleves
    )

[32] => Array
    (
        [0] => Green
        [1] => M
        [2] => Half selevs
    )

[33] => Array
    (
        [0] => Green
        [1] => M
        [2] => full seleves
    )

[34] => Array
    (
        [0] => Green
        [1] => S
        [2] => Half selevs
    )

[35] => Array
    (
        [0] => Green
        [1] => S
        [2] => full seleves
    )

[36] => Array
    (
        [0] => Green
        [1] => XL
        [2] => Half selevs
    )

[37] => Array
    (
        [0] => Green
        [1] => XL
        [2] => full seleves
    )

[38] => Array
    (
        [0] => Green
        [1] => XXL
        [2] => Half selevs
    )

[39] => Array
    (
        [0] => Green
        [1] => XXL
        [2] => full seleves
    )

)

我想要这样:

数组([0] => 数组([0] => 蓝色,红色,绿色 [1] => L,M [2] => 半色)

标签: phparrayscombinations

解决方案


你可以做这样的事情......

<?php
$variants = array();
$possible_letters = array('A','B','C');
$max_variant_number = 6;

foreach ($possible_letters as $possible_letter) {
 $min_variant_number = 0;
  while ($min_variant_number <= $max_variant_number) {
    $variants[] = $possible_letters.$min_variant_number;
    $min_variant_number++;
  }
}

这只是 2 个循环,它们在数组和不断增加的数字之间进行一些连接,直到数字耗尽,然后它移动到下一个字母并重置该数字。请注意它是一个嵌套循环,因此N 平方的顺序将适用于您进入复杂性理论。


推荐阅读