我可能可以独自破解这个,但是我的思绪在英国脱欧之后想到了,所以我决定问这些好人。我有这个硬件选项的数组(或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
在两个表中。第一个描述了给定计算机模型可用的硬件类别:
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和这些组合的价格。查询将类似于:
选择model modelID并重置数据(例如?modelID = 1)
选择catID和optID(例如?modelID = 1& catID = 1& optID = 1选择处理器:i3)
对所有可用类别重复2次(所以这里再次使用内存:4GB)
查询SKU和价格(现在它将获得i3,4 GB的结果)
对于此模型的所有组合从1开始重复 - 对于modelID 1为6次,对于modelID 2为3次。
这将是我上表的总请求列表:
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调用的最小化。
答案 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
其余如上所述。如果它适用于您,这将对您有所帮助。 对于您的情况有一个解决方案,但我认为这不是微不足道的,尤其难以维护。拥有一个结构良好的数据库可以为您节省很多长期的麻烦,但发现这一点也不是一件容易的事。
如果无法选择,每种型号都需要每种型号的默认硬件。这将解决我停止工作的问题,请参阅代码中的注释