php数组的组合
我可能独自一人就能破解这个问题,但我的头脑在怀疑英国脱欧后会发生什么,所以我决定问问周围这些善良的人。我有以下硬件选项数组(或SQL结果):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
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和这些组合的价格。查询将类似于:
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