Я работаю над проектом, в котором компания продает множество клапанов с огромным разнообразием вариантов, и мне нужно создать карту сайта со ссылками на все данные клапанов, поскольку текущая навигация не использует обычные ссылки, а коды, созданные с помощью пользователя, взаимодействующего с много вариантов на странице. Я был в состоянии генерировать все до тех пор, пока варианты не станут очень хитрыми из-за огромного количества комбинаций этих опций и правил, которым они следуют.
Я пытаюсь построить каждую комбинацию параметров строки с правилами, которые вы можете найти ниже.
Учитывая массив кодов опций (в конце поста), я должен сгенерировать список всех возможных комбинаций, но они должны следовать порядку, в котором они представлены, и следовать правилам, заданным row_mod. Например, когда код option_ для O находится в комбинациях, код option_on для ON и OP не допускается в комбинации.
Единственная информация row_mod, которой необходимо следовать в настоящее время при построении этих строк, — это «naWithOp ##», поскольку это относится к другой опции, которая не может быть с ней.
Вот некоторые из возможных комбинаций, которые могут понадобиться в сценарии:
Я знаю, что это даже не близко к исчерпывающему списку того, сколько фактически возможно, но я не могу понять, как генерировать все возможные комбинации.
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, который интерактивен так, что опции работают вместе. Найденный Вот
Я не уверен, какой подход я должен использовать, но я пытался использовать рекурсивные алгоритмы безрезультатно.
У вас есть восемь различных опций, которые могут быть использованы либо ноль, либо один раз. Таким образом, «не используется» делает это девять. Так что у тебя есть
Тогда ваше основное количество опций, не считая дополнительных правил совместимости опций, составляет 9 !, или 362880 комбинаций.
Вы можете просмотреть все возможные комбинации, а затем написать функцию, чтобы проверить, является ли эта комбинация допустимой, учитывая правила для каждого типа. Только элементы списка, для которых функция возвращает true
и отвергни остальных. Это может быть немного медленно, но это будет работать.
Чтобы сгенерировать эти комбинации, я бы визуализировал последовательность опций в виде 9-значного числа в базе 9 (т. Е. У вас есть 9 вещей, и каждая из них может принимать одно из 9 значений, с учетом ограничений, которые я отмечу ниже). я считать Я правильно сказал, что это 99 (38742048910) различные комбинации, если не было правила, запрещающего использование опции дважды.
Таким образом, просто циклически просматривайте эти числа в базе 9, отклоняйте любые числа, имеющие повторяющиеся цифры, и те, которые проходят через них, преобразуйте их в строку параметров и отклоняйте все, которые не проходят функцию правила для параметров. Список оставленных вами предметов будет полным набором разрешенных комбинаций.
Других решений пока нет …