php数组合并为

时间:2016-06-24 17:09:55

标签: 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  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,但是让#39 ;现在只是坚持使用这款Mac Pro。

修改:请注意,硬件类别的数量灵活 - 例如,MacBook只能有内存和硬盘选项。分类的数量不应受到限制。

这是更广义的输入:

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是唯一的):

modelID catID optID name
1       1     1     i3
1       1     2     i5
1       2     3     4GB
1       2     4     8GB
1       2     5     16GB
2       1     6     i3
2       1     7     i5
2       1     8     i7

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

  1. 选择model modelID并重置数据(例如?modelID = 1)

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

  3. 对所有可用类别重复2次(所以这里再次使用内存:4GB)

  4. 查询SKU和价格(现在它将获得i3,4 GB的结果)

  5. 对于此模型的所有组合从1开始重复 - 对于modelID 1为6次,对于modelID 2为3次。

  6. 这将是我上表的总请求列表:

    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?
    

    结果将是9个SKU,其中选项存储在数组中。

    result = array (
      sku, price, modelID, array ( catID => optID )
    )
    

    递归很可能是因为迭代次数不确定的方式。我在这里找到了this article,这是重复的更大候选者,但我仍然没有得到我的解决方案。我可能需要手动制作组合。

    后记

    最终,上面的链接对递归很有帮助,但它并没有做我想做的一切。在那一点上,我意识到我并不总是需要所有的组合 - 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调用的最小化。

1 个答案:

答案 0 :(得分:-2)

在你的问题被高度改变后,我试图想出另一个解决方案,但我失败了。我试图创造这样的东西。在几个版本之后我来到了这个:

$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

其余如上所述。如果它适用于您,这将对您有所帮助。 对于您的情况有一个解决方案,但我认为这不是微不足道的,尤其难以维护。拥有一个结构良好的数据库可以为您节省很多长期的麻烦,但发现这一点也不是一件容易的事。

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