【问题标题】:Creating SKU Codes Using PHP [closed]使用 PHP 创建 SKU 代码 [关闭]
【发布时间】:2016-09-28 13:28:35
【问题描述】:

我想立即道歉,因为我提出了一个没有太多先验信息的问题,但我不知道如何开始。

我需要根据已经存在的预设 SKU 分组创建一个 SKU 列表,类似于组合表或迭代表。

但是,手动执行此操作是一项荒谬的任务,我找不到任何 Javascript 站点可以让我按要求执行此操作。

我认为使用 PHP 类是实现目标的更有效方式。

AIM:目标项目将包含 5 种左右的项目类型。对于每种类型,它可以包含大约 15-20 个确切的代码。

例如 TYPE 1 可以是 Apple、Pear、Orange、Pineapple。等等。 TYPE 2 可以是红、绿、蓝、黑。等等

我需要能够为每种类型输入一个变体列表,并让它在可能存在的项目的每个可能迭代中连接变体。

我知道这会产生成千上万个(在这种情况下)SKU。

我遇到的问题是在创建迭代时类型总是重复。此外,这条规则也有例外,例如 Variant Apple 永远不会与 Variant Black 一起使用。所以这些类型永远不会在相同的串联代码中找到。

我敢肯定,对于某些人来说,这确实是非常简单的基本分组和类配置。因此,我非常感谢任何人为此提供的任何帮助。

非常感谢 - 刘易斯

【问题讨论】:

  • 遗憾的是,我在工作电脑前,这里没有我的任何代码。因此,由衷的道歉。
  • 听起来你需要找到一堆包含不同变体类型的数组的笛卡尔积。这将产生所有不同的排列......然后您需要过滤掉不应该匹配的变体的不良结果。您可以通过创建一系列规则并处理所有生成的变体来做到这一点。最后是一些将它们转换为 SKU 的逻辑......也许为每种类型分配唯一的代码?
  • 笛卡尔积!以前从未听说过,但在看了听起来很像我需要的数学之后。虽然不知道如何在 PHP 中做到这一点。
  • 幸好你在 Stackoverflow 上! stackoverflow.com/questions/6311779/…
  • 我很高兴我能哭。这给了我一个很好的出发点!我仍然一无所知,但至少现在我知道这个原理叫什么,我可以学习如何制作一个。如果有人对如何为此原则创建例外裁决有任何建议,我将不胜感激,我可以并且会自己做,但遗憾的是我在这个问题上争分夺秒,所以任何想要帮助的人都非常受欢迎。

标签: php class sku


【解决方案1】:

以下是非常快速和非常肮脏的东西,我只是把它放在一起来帮助你并开始一些东西......所以请不要“啊,那是垃圾代码 cmets”;)

<?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 = 将产品 id 并生成 SKU 代码作为键,而变体仍然是值,因此可以用于其他用途。

【讨论】:

  • 哇,真快,太棒了,我真的非常感激。关于例外规则,这给了我一个更好的观点,这也正是我所需要的。尽管您在这里使用了一些我不熟悉的做法,但冒着对您提出太多要求的风险,您能否向我解释一下这是如何工作的?我宁愿学习也不愿让你为我做。但我知道这是一个很高的要求。
  • 这会在转储中生成字符串位置标识符,是否有办法删除它们并按行拆分?
  • 如果您删除最后一行的array_keys($skus) 并执行var_dump($skus),您会看到它包含所有内容。我将在代码中添加一些 cmets 以便它有帮助
  • 你是明星!再次非常感谢,我将经历这一切并了解它是如何工作的,这样我就可以进行必要的更改以产生我需要的确切结果,你确实为我节省了一个月的工作时间,所以我非常感谢你。跨度>
  • 所以目前这会产生一个数据输出,该输出提供的字符串和数字引用不太有用。目前看起来像这样:- [0]=> string(18) "SKU-SKU-SKU" [1]=> string(20) "SKU-SKU-SKU" 有没有办法让输出排除字符串引用并在每一行分开?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 2017-11-30
  • 2014-01-28
  • 2015-08-19
  • 2013-06-02
  • 2014-03-04
相关资源
最近更新 更多