Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 根据选项组和选项计算产品变体_Php_Algorithm_E Commerce - Fatal编程技术网

Php 根据选项组和选项计算产品变体

Php 根据选项组和选项计算产品变体,php,algorithm,e-commerce,Php,Algorithm,E Commerce,我正在写一个电子商务网站,需要一个很好的方法来计算产品的变化。网站有产品,产品可以有很多选项组,选项组可以有很多选项 因此,T恤产品有3个选项组和选项: 大小: 小的 中等, 大, 颜色: 红色 蓝色 黄色的, 黑色 材料: 棉 尼龙 它创造了:小红棉,小红尼龙,小蓝棉,小蓝尼龙。。。诸如此类 我知道下面的脚本可以工作,但也可以进行优化。有人能提供一个更好的例子吗?也可以使用递归。。。但我遇到了心理障碍 if(count($option_groups) > 1) {

我正在写一个电子商务网站,需要一个很好的方法来计算产品的变化。网站有产品,产品可以有很多选项组,选项组可以有很多选项

因此,T恤产品有3个选项组和选项:

大小: 小的 中等, 大,

颜色: 红色 蓝色 黄色的, 黑色

材料: 棉 尼龙

它创造了:小红棉,小红尼龙,小蓝棉,小蓝尼龙。。。诸如此类

我知道下面的脚本可以工作,但也可以进行优化。有人能提供一个更好的例子吗?也可以使用递归。。。但我遇到了心理障碍

    if(count($option_groups) > 1)
    {
        // start the variants up
        foreach($option_groups[0]->get_options() as $option)
        {
            $variants[] = array($option);
        }

        // go through every other option group to make combos
        for($x = 1; $x < count($option_groups); $x++)
        {
            $combos = array();

            foreach($variants as $variant)
            {
                $new = array();
                foreach($option_groups[$x]->get_options() as $option)
                {
                    $tmp        = $variant;
                    $tmp[]  = $option;
                    $new[]  = $tmp;
                }
                $combos[] = $new;
            }
            $variants = array();
            foreach($combos as $combo)
            {
                foreach($combo as $tmp)
                {
                    $variants[] = $tmp;
                }
            }
        }
    }

这应该可以做到:

<?

$data[]=array('shirt');
$data[]=array('red','yellow','black');
$data[]=array('small','medium','large');

$combos=possible_combos($data);

//calculate all the possible comobos creatable from a given choices array
function possible_combos($groups, $prefix='') {
    $result = array();
    $group = array_shift($groups);
    foreach($group as $selected) {
        if($groups) {
            $result = array_merge($result, possible_combos($groups, $prefix . $selected. ' '));
        } else {
            $result[] = $prefix . $selected;
        }
    }
    return $result;
}

echo count($combos) . "\n";
print_r($combos);

如果这是一个电子商务网站,我猜您的选项组已经存在于SQL数据库中,那么为什么不让SQL为您进行组合呢

SELECT Size.Name, Color.Name, Material.Name FROM Size, Color, Material
但是,如果您将所有选项都放在一个表中,并且该表中的组有一个外键

SELECT r1.Name, r2.Name, r3.Name 
FROM Options r1, Options r2, Options r3
WHERE r1.GroupID = 1 -- id for Size
    AND r2.GroupID = 2 -- id for Color
    AND r3.GroupID = 3 -- id for Material

一旦你有了一个包含组ID的数组,生成上面的SQL语句就很简单了(只是连接了几个字符串内爆)。

有趣的是,这是我在采访中提出的一个问题,非常接近。难道你没有得到任何好的(或至少比我写的更好的)答案吗?作为一个Haskell福音传道者,我忍不住自夸这个功能是内置的:
序列[[“小”、“中”、“大”]、[“红”、“蓝”、“黄”、“黑”]、[“棉”、“尼龙”]=[“小”、“红”、“棉”]、[“小”、“红”、“尼龙”]、[“小”、“蓝”、“棉”]、[“小”、“蓝”、“尼龙”]、{-还有更多……-}]
如果php有这样一个函数,那就太好了。你可能了解到了一些东西,但我认为你误解了我的模式:产品(id\u产品,…),选项组(id\u选项组,id\u产品,名称),选项(id\u选项,id\u选项组,名称)-产品的选项组并没有设置为+1
SELECT r1.Name, r2.Name, r3.Name 
FROM Options r1, Options r2, Options r3
WHERE r1.GroupID = 1 -- id for Size
    AND r2.GroupID = 2 -- id for Color
    AND r3.GroupID = 3 -- id for Material