Использование php5.2 и MySQL 4.1.22
Я столкнулся с чем-то, что поначалу казалось простым, но с тех пор уклонялось от меня в отношении простого, чистого решения.
У нас есть заранее определенные «пакеты» продукта. Упаковка 1 может содержать продукты A, B и C. В упаковке 2 могут быть буквы A, C, D и G и т. Д. Размеры упаковок варьируются от 3 до 5 продуктов.
Теперь клиент может выбрать любые 10 доступных продуктов и сделать «индивидуальную» упаковку. Поскольку у нас уже есть определенные предопределенные пакеты, мы хотели бы создать пользовательский пакет с меньшими существующими пакетами (для удобства доставки), где это возможно.
Так, например, клиент выбирает для создания «пользовательский пакет» продуктов A, B, C, D, E и F. У нас уже есть предопределенный пакет, который содержит A, B и C, называемый Foo. Таким образом, порядок будет 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
Если я просто беру наибольшее совпадение, то у меня есть 1 (5 шт.) Пакет и 5 отдельных предметов. Ни Пакет (2), ни (3) не могут быть собраны с остальными предметами.
Если я загляну глубже, я обнаружу, что не собирая package (1), я могу вместо этого собрать package (2) и package (3). Это означает, что у меня есть 2 пакета и 4 отдельных предмета (лучший выбор в этом правиле бизнеса).
Поскольку я использую MySQL, я ограничен в наличии только одного слоя суб-выбора (насколько мне известно). Так что этот вид нужно будет выполнить в php. Я рассмотрел использование array_intersect () для определения совпадений, но каждый найденный мной способ экспоненциально растет по отношению к обработке, так как число предопределенных пакетов растет линейно.
Я проверил это парой других друзей-программистов и снова, хотя казалось, что должен быть простой ответ, который мы все обнаружили, что это не так просто, как кажется. Итак, я думал, что выложу это здесь как хороший носилки с лапшой. Большое спасибо за ваше время!