Php 寻找一种干净、高效的方法,将一组数据与已知模式进行匹配

Php 寻找一种干净、高效的方法,将一组数据与已知模式进行匹配,php,mysql,pattern-matching,Php,Mysql,Pattern Matching,使用php5.2和MySQL 4.1.22 我遇到了一些事情,一开始看起来很简单,但后来我一直回避一个简单、干净的解决方案 我们有预定义的产品“包装”。包装1可能包含产品A、B和C。包装2可能包含A、C、D和G等。包装的尺寸范围为3到5种产品 现在,客户可以选择任意10种可用产品并制作“定制”包。因为我们已经有了一些预定义的包,所以我们希望在可能的情况下使用较小的现有包(便于运输)构建定制包 因此,例如,客户选择创建产品a、B、C、D、E和F的“定制包”。我们已经有了一个预定义包,其中包含名为F

使用php5.2和MySQL 4.1.22

我遇到了一些事情,一开始看起来很简单,但后来我一直回避一个简单、干净的解决方案

我们有预定义的产品“包装”。包装1可能包含产品A、B和C。包装2可能包含A、C、D和G等。包装的尺寸范围为3到5种产品

现在,客户可以选择任意10种可用产品并制作“定制”包。因为我们已经有了一些预定义的包,所以我们希望在可能的情况下使用较小的现有包(便于运输)构建定制包

因此,例如,客户选择创建产品a、B、C、D、E和F的“定制包”。我们已经有了一个预定义包,其中包含名为Foo的a、B和C。那么,顺序是Foo,D,E和F

关键在于拥有最少数量的单个项目,然后是最少数量的包。例如:

定制包装:A、B、C、D、E、F、G、H、I、J

预定义包(1):A、B、C、D、E

预定义包(2):A、B、C

预定义包(3):D、E、F

如果我只拿最大的一个,那么我就有一个(5便士)的包裹和5个单独的物品。包(2)和包(3)都不能与剩余项目一起构建

如果我深入研究,我发现通过不构建包(1),我可以构建包(2)和包(3)。这意味着我有2个包和4个单独的项目(在这个商业规则中是更好的选择)

在使用MySQL时,据我所知,只有一层sub-select可用。因此,这种排序需要在php中执行。我曾研究过使用数组_intersect()来确定匹配项,但我发现的每种方法都会随着预定义包的数量线性增长而以指数方式增长


我和其他几位程序员朋友一次又一次地运行了这个程序,虽然看起来应该有一个简单的答案,但我们都发现它并不像看上去那么简单。所以,我想我应该把它贴在这里作为一个不错的面条担架。提前感谢您抽出时间

我建议您让客户帮忙。在产品选择屏幕中,显示可用的成套设备,并让它们进行组合(适当定价,以便一个设备的总和足以涵盖特殊处理)。

问题通常是一个“困难”问题(从计算复杂性的角度讲)。事实上,它在我的脑海中敲响了一些警钟,它可能会简化为一个经典的算法问题,如,但我不能给它起一个合适的名字

然而,由于问题空间如此之小(他们只能选择10种产品),应该可以相当快地对问题进行暴力处理。当有人提交一个定制构建时,只要尽可能地递归地攻击它,看看哪一个是最好的

也就是说,获取他们选择的组件,然后首先尝试从中删除“Package1”的组件。如果可能的话,取下剩下的组件,并尝试从中取下“包2”的组件,等等。在进行过程中跟踪您找到的最佳解决方案

如果它仍然不够快(但我认为可能会足够快,这取决于您有多少预构建包),您可以应用一些方法来加速它


编辑以添加:

根据可能性的数量以及实际运行所需的时间,您可能需要编写上面描述的代码,然后继续为每个可能的组合预先计算所有解决方案。然后,当有人提交自定义构建时,您只需获取答案,而不是每次从头开始计算


即使你不想预先计算它们,我建议每次有人进行自定义生成时都存储结果,以后如果有人进行相同的自定义生成,你也不必重新计算解决方案。

请原谅我让你的问题变得有点复杂。:-)

尽管您可能希望预先计算可能的解决方案,或者让消费者自己从预定义的包中进行选择:如果预定义的包不再有库存,该怎么办

如果此时不存在完成订单的解决方案,该怎么办?然后,您是否会发送订单的一部分,如果是这样:即使您知道以后可以选择预定义的包,您是否会包含单个项目

您真的确定预定义包不会分配一些“首选项”吗?例如,订购“ABCD”时要选择哪个预定义包,并且存在预定义包“ABC”和“BCD”?例如,如果您知道预定义的包“ABC”经常缺货,那么这可能会使“BCD”成为首选


所以:也许你需要使用一些模型,你可以很容易地改变一些硬编码的规则,而不是试图找到一个自动化的解决方案。这当然可能是PHP本身。

+1个很棒的问题,我不知道如何回答。我很想看看人们提出了什么,你们有多少产品,有多少预构建的软件包?我将详细介绍一些其他可能的解决方案/优化,具体取决于这些解决方案/优化的规模。此外,客户是否可以多次选择同一产品?我不情愿地+1,当我收到新答案时,我键入了完全相同的答案:幸运的是,我们从未缺货;)。在建模方面,您是正确的,因为它现在被设计为创建一个位掩码,其中包是可能的,这样您就可以对掩码应用业务规则来决定哪个选择是最佳的,而无需更改代码。