Использование 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) не могут быть собраны из оставшихся предметов.
Если я загляну глубже, я обнаружу, что, не собирая пакет (1), я могу вместо этого собрать пакет (2) и пакет (3). Это означает, что у меня есть 2 пакета и 4 отдельных предмета (лучший выбор в этом бизнес-правиле).
Поскольку я использую MySQL, я ограничен наличием только одного уровня подвыборки (насколько мне известно). Так что эту сортировку нужно будет выполнять в php. Я рассматривал использование array_intersect() для определения совпадений, но каждый способ, который я нашел, растет экспоненциально в отношении обработки, поскольку количество предопределенных пакетов растет линейно.
Я проверил это с парой других друзей-кодеров, и снова, хотя казалось, что должен быть простой ответ, мы все обнаружили, что это не так просто, как кажется. Итак, я решил опубликовать это здесь как хороший носилок для лапши. Заранее спасибо за ваше время!