Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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_Mysql - Fatal编程技术网

php数组的组合

php数组的组合,php,mysql,Php,Mysql,我可能独自一人就能破解这个问题,但我的头脑在怀疑英国脱欧后会发生什么,所以我决定问问周围这些善良的人。我有以下硬件选项数组(或SQL结果): cId cName vId vName 1 Processor 679 3.5GHz 6-Core 1 Processor 680 3.0GHz 8-Core 1 Processor 681 2.7GHz 12-Core 2 Memory 682 16GB 2 Memory 683

我可能独自一人就能破解这个问题,但我的头脑在怀疑英国脱欧后会发生什么,所以我决定问问周围这些善良的人。我有以下硬件选项数组(或SQL结果):

cId  cName      vId  vName
1    Processor  679  3.5GHz 6-Core
1    Processor  680  3.0GHz 8-Core
1    Processor  681  2.7GHz 12-Core
2    Memory     682  16GB
2    Memory     683  32GB
2    Memory     684  64GB
5    HDD        685  256GB
5    HDD        686  512GB
5    HDD        687  1TB
11   Graphics   688  D500 with 3GB
11   Graphics   689  D700 with 6GB
我正在寻找列出所有选项组合的最有效方法,首先是

3.5GHz 6-Core, 16GB, 256GB, D500 with 3GB

2.7GHz 12-Core, 64GB, 1TB, D700 with 6GB
我相信是54行。有没有快速使用PHP的方法

或者在MySQL中。事实上,输入数据在两个表中-一个表有类别ID和名称,另一个表有类别ID、值ID和值名称(当然,还有其他计算机的模型ID,但现在让我们继续使用Mac Pro)

编辑:请注意硬件类别的数量是灵活的——例如MacBook只能有内存和HDD选项。分类的数量不应受到限制

这是更一般化的输入:

c1 = array ( v1, v2 )
c2 = array ( v3, v4, v5)
其中两个类别的数量或一个类别中的值都是灵活的。这就是结果,六个值的组合:

c1 v1, c2 v3
c1 v1, c2 v4
c1 v1, c2 v5
c1 v2, c2 v3
c1 v2, c2 v4
c1 v2, c2 v5
当我再添加一个类别时

c5 = array ( v6, v7)
将有十二种组合:

c1 v1, c2 v3, c5 v6
c1 v1, c2 v3, c5 v7
c1 v1, c2 v4, c5 v6
c1 v1, c2 v4, c5 v7
c1 v1, c2 v5, c5 v6
c1 v1, c2 v5, c5 v7
c1 v2, c2 v3, c5 v6
c1 v2, c2 v3, c5 v7
c1 v2, c2 v4, c5 v6
c1 v2, c2 v4, c5 v7
c1 v2, c2 v5, c5 v6
c1 v2, c2 v5, c5 v7
SQL数据 在两张桌子里。第一个描述了给定计算机型号的可用硬件类别:

modelID catID name
1       1     Processor
1       2     Memory
2       1     Processor
因此,这里的计算机型号2只有一个选择-不同的处理器

表2描述了可用的选项(optID是唯一的):

所以这里我们可以有一台有六种不同组合的电脑,另一台有三种。作为输出,我需要的是一系列组合,因为我将在API中查询SKU和这些组合的价格。查询将类似于:

  • 选择模型ID并重置数据(例如?模型ID=1)

  • 选择catID和optID(例如?modelID=1&catID=1&optID=1选择处理器:i3)

  • 对所有可用类别重复2次(因此这里再次使用内存:4GB)

  • 查询SKU和价格(因此现在可以得到i3、4 GB的结果)

  • 对于此模型的所有组合,从1开始重复-对于modelID 1重复六次,对于modelID 2重复三次

  • 这将是我上表的请求总数:

    select?modelID=1
    choose?modelID=1&catID=1&optID=1
    choose?modelID=1&catID=2&optID=3
    price?
    
    select?modelID=1
    choose?modelID=1&catID=1&optID=1
    choose?modelID=1&catID=2&optID=4
    price?
    
    select?modelID=1
    choose?modelID=1&catID=1&optID=1
    choose?modelID=1&catID=2&optID=5
    price?
    
    select?modelID=1
    choose?modelID=1&catID=1&optID=2
    choose?modelID=1&catID=2&optID=3
    price?
    
    select?modelID=1
    choose?modelID=1&catID=1&optID=2
    choose?modelID=1&catID=2&optID=4
    price?
    
    select?modelID=1
    choose?modelID=1&catID=1&optID=2
    choose?modelID=1&catID=2&optID=5
    price?
    
    select?modelID=2
    choose?modelID=2&catID=1&optID=6
    price?
    
    select?modelID=2
    choose?modelID=2&catID=1&optID=7
    price?
    
    select?modelID=2
    choose?modelID=2&catID=1&optID=8
    price?
    
    结果将是九个SKU,选项存储在一个数组中

    result = array (
      sku, price, modelID, array ( catID => optID )
    )
    
    递归是最有可能的方法,因为迭代次数是不确定的。我在这里找到了一个更大的复制品,但我仍然没有得到我的解决方案。我可能不得不手动进行组合

    后记 最后,上面的链接对递归非常有用,但它并没有实现我想要的一切。在这一点上,我意识到我并不总是需要所有的组合——API记住了catID的位置,所以我只需要改变那些我必须改变的。这也意味着对API的调用更少(22对33):

    select?modelID=1
    
    choose?catID=1&optID=1
    choose?catID=2&optID=3
    price?
    
    choose?catID=2&optID=4
    price?
    
    choose?catID=2&optID=5
    price?
    
    choose?catID=1&optID=2
    choose?catID=2&optID=3
    price?
    
    choose?catID=2&optID=4
    price?
    
    choose?catID=2&optID=5
    price?
    
    select?modelID=2
    
    choose?catID=1&optID=6
    price?
    
    choose?catID=1&optID=7
    price?
    
    choose?catID=1&optID=8
    price?
    
    这是代码:

    <?php
    function possibilities($input) {
        $current = array_shift($input);
        foreach ($current['optID'] as $optid) {
            echo "choose?catID=", $current['catID'], "&optID=", $optid, PHP_EOL;
            if (empty($input)) {
                echo "price?", PHP_EOL, PHP_EOL;
            } else {
                possibilities($input);
            }
        }
    }
    
    $models[] = array(
        'modelID' => 1,
        'options' => array(
            array('catID' => 1, 'optID' => array(1, 2)),
            array('catID' => 2, 'optID' => array(3, 4, 5))
            )
        );
    $models[] = array(
        'modelID' => 2,
        'options' => array(
            array('catID' => 1, 'optID' => array(6, 7, 8))
            )
        );
    
    foreach ($models as $model) {
        echo "select?modelID=", $model['modelID'], PHP_EOL, PHP_EOL;
        possibilities($model['options']);
    }
    ?>
    
    
    

    所以我可以把所有的价格都放在一张桌子上。我不得不再次解析表行中的所有选项。我相信有人不仅知道如何在一个步骤中完成,而且知道如何对组合进行排序,以实现API调用总数的最小化

    在你的问题被大幅修改后,我试图想出另一个解决方案,但失败了。我试着创造这样的东西。经过几个版本后,我得出以下结论:

    $allCombinations = array();
    
    $yourDB1[0] = array("modelID" => 1, "catID" => 1,"name" => "Processor");
    $yourDB1[1] = array("modelID" => 1, "catID" => 2,"name" => "Memory");
    $yourDB1[2] = array("modelID" => 2, "catID" => 1,"name" => "Processor");
    
    $yourDB2[0] = array("modelID" => 1, "catID" => 1, "optID" => 1, "name" => "i3");
    $yourDB2[1] = array("modelID" => 1, "catID" => 1, "optID" => 2, "name" => "i5");
    $yourDB2[2] = array("modelID" => 1, "catID" => 2, "optID" => 3, "name" => "4GB");
    $yourDB2[3] = array("modelID" => 1, "catID" => 2, "optID" => 4, "name" => "8GB");
    $yourDB2[4] = array("modelID" => 1, "catID" => 2, "optID" => 5, "name" => "16GB");
    $yourDB2[5] = array("modelID" => 2, "catID" => 1, "optID" => 6, "name" => "i3");
    $yourDB2[6] = array("modelID" => 2, "catID" => 1, "optID" => 7, "name" => "i5");
    $yourDB2[7] = array("modelID" => 2, "catID" => 1, "optID" => 8, "name" => "i7");
    
    $allModels = array();
    $sizeDB1 = count($yourDB1);
    $sizeDB2 = count($yourDB2);
    
    for($i = 0; $i < $sizeDB2; $i++)
    {
        $allModels[$yourDB2[$i]["modelID"]][] = $yourDB2[$i];
    }
    
    $models = array_unique(array_keys($allModels));
    $amountModels = count($models);
    
    for($i = 0; $i < $amountModels; $i++)
    {
        $amountCatIDs = count($allModels[$models[$i]]);
    
        $allCat = array();
        for($j = 0; $j < $amountCatIDs; $j++)
        {
            $allCat[$allModels[$models[$i]][$j]["catID"]][] = 1;
        }
    
        $amountCat = count($allCat);
        $cat = array_key($allCat);
        for($j = 0; $j < $amountCat; $j++)
        {
            //Here it is tricky because of multiple possible options of hardware
        }
    }
    
    其余的如上所述。如果它适用于你,这将对你有很大帮助。 对于您的情况,有一个解决方案,但我认为它不是微不足道的,特别难以维护。拥有一个结构良好的数据库从长远来看会为您节省很多麻烦,但发现这一点也不是小事


    或者,如果无法选择,则每种型号都需要每种类型的默认硬件。这将解决我停止工作时的问题,请参见代码中的注释

    Four foreach-makes,您可以分享您的尝试吗?请阅读我的答案是否解决了您的问题?谢谢您的努力。不幸的是,我忘了提到这个列表是非常动态的-例如,一些笔记本电脑只能选择两种内存配置,但有六种不同大小的高清。您的阵列的具体格式是什么?然后我可以给你一些完全动态的代码,但我需要一个起点(结构)。它是一个二维数组,数字数组还是关联数组?它是一个与上面形式相同的数据库吗?所需的输出格式是什么?很好,非常感谢。原始数据是两个表。我将更新描述。我更改了答案,请参见上文。我当然愿意进一步讨论。虽然我不能解决你的问题,但我希望我能至少帮你一点忙,我希望我能投一票,因为我花了将近2个小时尝试不同的东西。不幸的是,我无法改变格式,是API给了我答案,主要是:类别需要完全灵活,例如,一个新的可以作为另一个表行引入,ID必须是索引整数,而不是分解的字符串。
    $allCombinations = array();
    
    $yourDB1[0] = array("modelID" => 1, "catID" => 1,"name" => "Processor");
    $yourDB1[1] = array("modelID" => 1, "catID" => 2,"name" => "Memory");
    $yourDB1[2] = array("modelID" => 2, "catID" => 1,"name" => "Processor");
    
    $yourDB2[0] = array("modelID" => 1, "catID" => 1, "optID" => 1, "name" => "i3");
    $yourDB2[1] = array("modelID" => 1, "catID" => 1, "optID" => 2, "name" => "i5");
    $yourDB2[2] = array("modelID" => 1, "catID" => 2, "optID" => 3, "name" => "4GB");
    $yourDB2[3] = array("modelID" => 1, "catID" => 2, "optID" => 4, "name" => "8GB");
    $yourDB2[4] = array("modelID" => 1, "catID" => 2, "optID" => 5, "name" => "16GB");
    $yourDB2[5] = array("modelID" => 2, "catID" => 1, "optID" => 6, "name" => "i3");
    $yourDB2[6] = array("modelID" => 2, "catID" => 1, "optID" => 7, "name" => "i5");
    $yourDB2[7] = array("modelID" => 2, "catID" => 1, "optID" => 8, "name" => "i7");
    
    $allModels = array();
    $sizeDB1 = count($yourDB1);
    $sizeDB2 = count($yourDB2);
    
    for($i = 0; $i < $sizeDB2; $i++)
    {
        $allModels[$yourDB2[$i]["modelID"]][] = $yourDB2[$i];
    }
    
    $models = array_unique(array_keys($allModels));
    $amountModels = count($models);
    
    for($i = 0; $i < $amountModels; $i++)
    {
        $amountCatIDs = count($allModels[$models[$i]]);
    
        $allCat = array();
        for($j = 0; $j < $amountCatIDs; $j++)
        {
            $allCat[$allModels[$models[$i]][$j]["catID"]][] = 1;
        }
    
        $amountCat = count($allCat);
        $cat = array_key($allCat);
        for($j = 0; $j < $amountCat; $j++)
        {
            //Here it is tricky because of multiple possible options of hardware
        }
    }
    
    Model Table:
    
    modelID   cpuIDs   ramIDs   hdIDs   gpuIDs
    1         2,5      1,2,3    1       1,2
    2         2,5      1,2      1,2,4   2,3
    3         3,6      2,3      2,3     1,3
    
    CPU Table:
    
    cpuID    name    Specs      Other
    1        i3      2,0 GHz    5. generation
    2        i3      1,9 GHz    4. generation
    3        i5      2,5 GHz    4. generation