2016-09-28 7 views
1

Я хотел извиниться с места в карьер, чтобы задать вопрос с очень маленькой предварительной информацией, но я не понимаю, как начать работу.Создание кодов SKU с использованием PHP

Мне нужно создать список SKU на основе предустановленной группировки SKU, которая уже существует как таблица комбинаций или таблица итераций.

Однако делать это вручную - это смешная задача, и я не мог найти ни одного сайта Javascript, который позволил бы мне делать это по мере необходимости.

Использование классов PHP Я думал, что это будет гораздо более эффективный способ достижения цели.

ЦЕЛЬ: Целевой элемент будет состоять из 5 или около ТИПов предметов. Для каждого ТИПА имеется приблизительно 15-20 точных кодов, из которых он может состоять.

Например, ТИП 1 может быть яблоком, грушей, апельсином, ананасом. И т.д. ТИП 2 может быть красным, зеленым, синим, черным. Etc

Мне нужно иметь возможность вводить список вариантов для каждого ТИПА и объединять его в каждую возможную итерацию объекта, который может существовать.

Я знаю, что это создаст 10 тысяч тысяч (в данном случае) SKU.

Проблема, с которой я сталкиваюсь, заключается в создании итераций, которые типы всегда дублируют. Кроме того, существуют исключения из этого правила, например, Variant Apple никогда не может быть с Variant Black. Таким образом, эти типы никогда не будут найдены в одном конкатенированном коде.

Я уверен, что для кого-то их это действительно очень простая базовая группировка и конфигурация класса. Поэтому я очень ценю любую помощь, которую любой может иметь для этого.

Большое спасибо - Льюис

+0

К сожалению, я нахожусь на своем рабочем компьютере и не имею никакого кода. Отсюда сердечные извинения. – LewisMCT333

+1

Похоже, вам нужно найти декартово произведение множества массивов, содержащих разные типы вариантов. Это создало бы все различные перестановки ... тогда вам нужно отфильтровать плохие результаты с вариантами, которые не должны совпадать. Вы можете сделать это, создав массив правил и обработав все сгенерированные варианты. Наконец, некоторая логика, чтобы превратить их в SKU ... возможно, присваивая уникальные коды каждому типу? –

+0

Декартовы продукты! никогда не слышал об этом раньше, но после изучения математики, которая очень напоминает то, что мне нужно. Не знаю, как это сделать на PHP. – LewisMCT333

ответ

3

Ниже что-то очень быстро и очень грязный, я просто бросил его вместе, чтобы дать вам руку помощи и что-то, чтобы начать с ... поэтому, пожалуйста, не «ах Thats мусор комментарии код»)

<?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 
  • порождающие = это принимает ваши инструкции
  • permutate = функция декартово произведение украдено из ссылки я предоставил перед тем
  • squelch = удаляет перестановки на основе правил
  • skuify = принимает идентификатор продукта и генерирует коды SKU в качестве ключа, а вариант остается значением, поэтому его можно использовать для чего-то еще.
+0

Ничего себе, это было быстро, это потрясающе, я действительно очень благодарен. Это дает мне гораздо лучший момент, чтобы перейти от правил исключения, а это в значительной степени именно то, что мне нужно. Хотя вы использовали некоторые практики здесь, о которых я не знаком, рискуя спросить слишком много из вас, сможете ли вы объяснить мне, как это работает? Я бы предпочел учиться, чем просто позволить вам сделать это для меня. Но я знаю, что это высокий запрос. – LewisMCT333

+0

Это создает идентификаторы местоположения строк в дампе, есть ли способ удалить их и разделить их по строкам? – LewisMCT333

+0

Если вы удалите 'array_keys ($ skus)' в последней строке и просто выполните 'var_dump ($ skus)', вы увидите, что в нем есть все. Я добавлю некоторые комментарии к коду, чтобы он помог –