Я хотел извиниться за то, что задал вопрос с очень небольшим количеством предшествующей информации, но я в растерянности относительно того, как вообще начать.
Мне нужно создать список SKU на основе предварительно установленной группировки SKU, которая уже существует, как таблица комбинаций или таблица итераций.
Однако делать это вручную — нелепая задача, и я не смог найти сайт Javascript, который позволил бы мне делать это по мере необходимости.
Используя PHP классы, я подумал, что это будет гораздо более эффективный способ достижения цели.
ЦЕЛЬ: Целевой предмет будет состоять из 5 или около того ТИПОВ предметов. Для каждого ТИПА существует приблизительно 15-20 точных кодов, из которых он может состоять.
Например, тип 1 может быть яблоко, груша, апельсин, ананас. И т.п.
ТИП 2 может быть красным, зеленым, синим, черным. Так далее
Мне нужно иметь возможность вводить список вариантов для каждого ТИПА и объединять его в каждой возможной итерации элемента, который может существовать.
Я знаю, что это создаст десятки тысяч (в данном случае) SKU.
Проблема, с которой я сталкиваюсь, заключается в том, что при создании итераций типы всегда дублируются. Кроме того, есть исключения из этого правила, например, Variant Apple никогда не может быть с Variant Black. Таким образом, эти типы никогда не будут найдены в одном и том же сцепленном коде.
Я уверен, что для кого-то это действительно очень простая базовая группировка и настройка классов. Поэтому я очень ценю любую помощь, которую кто-либо может оказать для этого.
Большое спасибо — Льюис
Вот что-то ОЧЕНЬ БЫСТРО и ОЧЕНЬ ГРЯЗНО, я просто собрал это вместе, чтобы дать вам руку помощи и кое-что для начала … так что, пожалуйста, не «ах, это комментарии к мусорному коду»;)
<?php
class SkuGenerator2000
{
public function generate($productId, array $variants, array $disallow)
{
// First lets get all of the different permutations = cartesian product
$permutations = $this->permutate($variants);
// Now lets get rid of the pesky combinations we don't want
$filtered = $this->squelch($permutations, $disallow);
// Finally we can generate some SKU codes using the $productId as the prefix
// this assumes you want to reuse this code for different products
$skus = $this->skuify($productId, $filtered);
return $skus;
}
public function permutate(array $variants)
{
// filter out empty values
// This is the cartesian product code
$input = array_filter($variants);
$result = array(array());
foreach ($input as $key => $values) {
$append = array();
foreach($result as $product) {
foreach($values as $item) {
$product[$key] = $item;
$append[] = $product;
}
}
$result = $append;
}
return $result;
}
public function squelch(array $permutations, array $rules)
{
// We need to loop over the differnt permutations we have generated
foreach ($permutations as $per => $values) {
$valid = true;
$test = array();
// Using the values, we build up a comparison array to use against the rules
foreach ($values as $id => $val) {
// Add the KEY from the value to the test array, we're trying to make an
// array which is the same as our rule
$test[$id] = $val[0];
}
// Now lets check all of our rules against our new test array
foreach ($rules as $rule) {
// We use array_diff to get an array of differences, then count this array
// if the count is zero, then there are no differences and our test matches
// the rule exactly, which means our permutation is invalid
if (count(array_diff($rule, $test)) <= 0) {
$valid = false;
}
}
// If we found it was an invalid permutation, we need to remove it from our data
if (!$valid) {
unset($permutations[$per]);
}
}
// return the permutations, with the bad combinations removed
return $permutations;
}
public function skuify($productId, array $variants)
{
// Lets create a new array to store our codes
$skus = array();
// For each of the permutations we generated
foreach ($variants as $variant) {
$ids = array();
// Get the ids (which are the first values) and add them to an array
foreach ($variant as $vals) {
$ids[] = $vals[0];
}
// Now we create our SKU code using the ids we got from our values. First lets use the
// product id as our prefix, implode will join all the values in our array together using
// the separator argument givem `-`. This creates our new SKU key, and we store the original
// variant as its value
$skus[$productId . '-' . implode('-', $ids)] = $variant;
// The bit above can be modified to generate the skues in a different way. It's a case of
// dumping out our variant data and trying to figure what you want to do with it.
}
// finall we return our skus
return $skus;
}
}
// Possible variants
$variants = array(
'brand' => array(
// the first value in our array is our SKU identifier, this will be used to create our unqiue SKU code
// the second value is a nice name, description if you will
array('AP', 'Apple'),
array('BA', 'Banana'),
array('PE', 'Pear'),
),
'color' => array(
array('RE', 'Red'),
array('GR', 'Green'),
array('BL', 'Blue'),
),
);
// Rules for combinations I dont want
$disallow = array(
array('brand' => 'AP', 'color' => 'GR'), // No green apples
array('brand' => 'AP', 'color' => 'RE'), // No red apples
array('brand' => 'PE', 'color' => 'BL'), // No blue pears
);
// Create new class
$skuGenerator = new SkuGenerator2000();
// Get me my skus!
$skus = $skuGenerator->generate('PHONE1', $variants, $disallow);
var_dump(array_keys($skus)); // Dump just the skus
// separate our data
echo "\n\n";
// Now dump the entire result!
var_dump($skus); // Dump it all
Других решений пока нет …