两个数组之间的多维数组合

时间:2017-11-28 13:35:26

标签: php arrays multidimensional-array combinations

我正在研究用 PHP 编写的这个项目,它本质上是一个网上商店,我需要生成一些XML来显示哪些产品是待售的。

现在,每个产品本身都可以拥有所谓的属性,例如高度,颜色,形状等。每个属性都可以拥有它自己的属性,如高度。高度可以是120厘米,150厘米,180厘米等。

可以有多少属性或可能有多少属性没有限制。

那么,我如何找到theese 2阵列之间的所有组合?

下面是一个真正被剥离的产品json的例子: 为了所有强烈的目的,让我们在解码后将这个数组称为$ products。

{
    {
        "product_id":"1",
        "product_name":"Blommebladet tj\u00f8rn",
        "product_price":"400",
    },
    {
        "product_id":"2",
        "product_name":"Some other product",
        "product_price":"300",
    },
}

通过产品本身循环并不难。但是,当循环遍历产品并获取属性时,它会返回一个新数组,其中包含产品及其属性的所有属性。这也很容易。

我需要系统生成一个新的产品列表,其中包含所有可能的产品组合,而不必考虑处理额外的数组。我想通过复制现有产品并在现有信息上添加属性/属性来制作新的产品阵列并将信息塞进其中。

属性/属性剥离版本。 此属性属于我的产品列表中的第一个产品。

[{
    "attribute_name": "H\u00f8jde",
    "properties": {
        "359": {
            "property_name": "125 cm"
        },
        "356": {
            "property_name": "150 cm"
        },
        "357": {
            "property_name": "180 cm"
        },
        "358": {
            "property_name": "220 cm"
        }
    }
}] 

这是我想要发生的事情的一个例子。 我想要一个新阵列,让我们称之为$ variants。

这应该只是复制基础产品并添加额外信息,以使它们成为新产品"。它仍然是相同的基础产品,因此ID无法更改。

名称应更改为" Prod_name - [{Attr_name Prop_name},]" 例如。喜欢:

Blommebladet tj \ u00f8rn - H \ u00f8jde 125cm,
Blommebladet tj \ u00f8rn - H \ u00f8jde 150cm,
Blommebladet tj \ u00f8rn - H \ u00f8jde 160cm

希望你明白我的意思并帮助我!提前谢谢。

1 个答案:

答案 0 :(得分:0)

您应该查找返回x值(在您的情况下为属性)而不重复的组合算法。 我可以为你提供这样的,但用C语言编写,你可能会觉得它很有用,并用你喜欢的语言实现逻辑。

#include <stdio.h>
#define MAXN 20
// Finds all combinations of n from k
const unsigned n = 5;
const unsigned k = 3;
unsigned mp[MAXN];
void print(unsigned length)
{
    unsigned i;
    for (i = 0; i < length; i++) printf("%u ", mp[i]);
    printf("\n");
}
void comb(unsigned i, unsigned after)
{
    unsigned j;
    if (i > k) return;
    for (j = after + 1; j <= n; j++) {
        mp[i - 1] = j;
        if (i == k) print(i);
        comb(i + 1, j);
    }
}

int main() {
    printf("C(%u,%u): \n", n, k);
    comb(1, 0);
    return 0;
}


    /* Results:
    1 2 3
    1 2 4
    1 2 5
    1 3 4
    1 3 5
    1 4 5
    2 3 4
    2 3 5
    2 4 5
    3 4 5  
*/