列出选项字符串的所有组合,同时遵循所提供数组的顺序和特定选项的规则


List all combinations of option strings while following order of supplied array and rules of specific options - php

我正在研究一个项目,其中一家公司销售大量的阀门与各种各样的变化,需要建立一个网站地图链接到每个阀门数据,因为当前的导航不使用传统的链接,但通过用户与页面上的许多选项交互构建的代码。我已经能够生成所有东西,直到选项开始变得非常棘手,因为这些选项有大量的组合以及它们遵循的规则。

我正在尝试用下面的规则构建每个选项字符串组合。

给定选项代码数组(在帖子的末尾),我必须生成所有可能组合的列表,但它们必须遵循它们呈现的顺序并遵循row_mod给出的规则。例如,当O的option_code在组合中时,ON和OP的option_code不允许在组合中。

在构建这些字符串时,当前唯一需要遵循的row_mod信息是"naWithOp##",因为它引用了另一个不允许与它在一起的选项。

脚本中需要出现的一些可能的组合如下:

  1. OTKZ
  2. OTK
  3. OT
  4. OTOSZ
  5. oto
  6. O
  7. OL
  8. OLKZ
  9. OLK

我知道这还远远没有列出所有可能的组合,但我不知道如何生成所有可能的组合。


Array
(
    [0] => Array
        (
            [option_code] => O
            [row_mod] => allowAll naWithOpON naWithOpOP
        )
    [1] => Array
        (
            [option_code] => ON
            [row_mod] => allowAll naWithOpO naWithOpOP
        )
    [2] => Array
        (
            [option_code] => OP
            [row_mod] => allowAll naWithOpO naWithOpON
        )
    [3] => Array
        (
            [option_code] => T
            [row_mod] => allowAll naWithOpL
        )
    [4] => Array
        (
            [option_code] => L
            [row_mod] => allowAll naWithOpT naWithCoilX
        )
    [5] => Array
        (
            [option_code] => K
            [row_mod] => allow2 allow3 allow3P naWithOpOS
        )
    [6] => Array
        (
            [option_code] => OS
            [row_mod] => allow2 allow3 allow3P naWithOpK
        )
    [7] => Array
        (
            [option_code] => Z
            [row_mod] => allowAll naWithPreB
        )
)

基本上,我必须从第一个选项代码开始,并从第一个给定选项"O"开始向下迭代列表,然后转到下一个选项"on"并检查其是否有效,如果有效,则将其添加到当前组合中。诸如此类,构建允许的组合并将它们存储到数组中。

用户界面示例:我创建了一个jsfiddle,它通过选项一起工作的方式进行交互。在这里找到

我不确定我应该采取什么方法,但我试过使用递归算法,但无济于事。

您有八个不同的选项,这些选项似乎可用0次或1次。因此,"未使用"是9。这里有

  • 第一个选项有9种可能,
  • 第二个有8种可能(因为第一个不能被重用),
  • 第三种有7种可能(因为前两种不能重复使用)

你的基本选项数,不包括额外的选项兼容性规则,是9!,或362880个组合。

您可以循环遍历所有可能的组合,然后根据每种类型的规则编写一个函数来测试该组合是否有效。只列出函数返回true的项目,拒绝其他项目。它可能有点慢,但它会工作的。

为了生成这些组合,我会将选项序列可视化为以9为基数的9位数(即你有9个东西,它们每个都可以取9个值中的一个,受我下面注意到的限制)。我认为我说这是99 (38742048910)不同的组合是正确的,如果没有规则禁止一个选项被使用两次。

因此,只需循环遍历这些以9为基数的数字,拒绝任何有重复数字的数字,并将通过的数字转换为选项字符串,并拒绝任何未通过per-options规则函数的数字。剩下的项列表将是允许的全部组合。