gpt4 book ai didi

php - 生成所有可能的组合

转载 作者:可可西里 更新时间:2023-10-31 23:18:33 25 4
gpt4 key购买 nike

我有一个应用程序,用户可以在其中通过从菜单中选择选项来自定义他们要购买的产品。这个菜单有很多部分,每个部分可能有一个用于多选的复选框列表,或者当只能选择一个选项时的单选按钮。用户必须在每个部分至少选择一个选项。菜单结构是这样的:

$sections = array();

$sections[1] = array(
'multichoice' => true,
'options' => array('A','B','C')
);

$sections[2] = array(
'multichoice' => false,
'options' => array('A','B','C','D')
);

$sections[3] = array(
'multichoice' => false,
'options' => array('A','B')
);

$sections[4] = array(
'multichoice' => true,
'options' => array('A','B','C','D','E')
);

示例:三明治是产品。面包的类型是一个“部分”的选择。您可能想要清淡的面包、黑面包、牛奶面包或纯素面包。此部分下只能选择一个选项。现在在“沙拉”部分,您可以选择不止一种沙拉添加到面包中。

现在,我的老板要求我创建一个页面,列出所有可能的组合,以防用户懒得自己构建产品。所以我必须能够生成这样的结构:

$combinations = array(
array(
1 => array('A','B'),
2 => 'A',
3 => 'A',
4 => array('B','D','E')
),
array(
1 => array('A'),
2 => 'B',
3 => 'A',
4 => array('A','B')
)
// etc...
);

我已经设法使用随机方法找到所有可能的组合,生成哈希以与已经生成的内容进行比较。这确实有效,但运行速度非常慢(这基本上是蛮力):

...

function generate(){
$result = array();
$ids = array();
foreach($this->getSections() as $sect){
$items = $this->getSectionOptions($sect['id']);
if($sect['multi']=='N'){
$item = $items[rand(0, count($items)-1)];
$result[$sect['id']] = $item['id'];
$ids[] = $item['id'];
} else {
$how_many = rand(1,count($items));
shuffle($items);
for($i=1;$i<=$how_many;$i++){
$item = array_shift($items);
$result[$sect['id']][] = $item['id'];
$ids[] = $item['id'];
}
}
}
sort($ids);
return array(
'hash' => implode(',',$ids),
'items' => $result
);
}

function generateMany($attempts=1000){
$result = array();
$hashes = array();
for($i=1;$i<=$attempts;$i++){
$combine = $this->generate();
if(!in_array($combine['hash'],$hashes)){
$result[] = $combine['items'];
$hashes[] = $combine['hash'];
}
}
return $result;
}


...

我需要你的帮助来创建更精确、更快速的东西。请记住,每个组合必须至少有每个部分的一个选项。还要记住,多项选择部分中选项的顺序是无关紧要的,(即 E、B、A 与 B、E、A 相同)

谢谢

最佳答案

谢谢,这是一个非常有趣的拼图!

那我是怎么解决的,递归递归递归:D

我从多项选择开始,因为它是最难的! (实际上它也会解决混合问题)

解释

为了解释我是如何让它工作的,让我们举一个选择 A、B、C 的例子。然后我们会有以下组合:

A B
A B C
A C
B
B C
C

如果我们仔细观察,我们可以看到一些模式。让我们取结果列表的第一个元素 (A)

B
B C
C
---
B
B C
C

嗯,有趣...现在让我们再次第一个元素 (B)

C
---
C

这是一个简单的案例,但在任何大小的案例中都会发生这种情况。

所以我让递归脚本走到最后,然后向后添加迭代组合并将其与先前的值复制。

瞧!就是这个!

对于需要所有元素的最终混合,我做了一个非常相似的方法,但它必须每个包含 1 个元素

而且速度相当快!

Total time for 100000 iterations with 126 combinations: 14.410287857056 seconds

如果你发现任何错误,请 ping 我 :D

代码

https://gist.github.com/MLoureiro/a0ecd1ef477e08b6b83a

关于php - 生成所有可能的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33044401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com