php - PHP 从数据中提取所有可能的组合
问题描述
我想将以下数组 ($OriginalData) 中数据的所有可能变化提取到第二个数组 ($Variations) 中的布局方式。
在这种情况下,有 3 个问题,但这个数字是可变的。第 1 题有 3 个选项,第 2 题有 5 个选项,第 3 题有 2 个选项。
我需要获得一组对象,其中包含 3 个问题的每个可能的答案组合。在这种情况下,我相信应该有 30 种可能的组合。我在 $Variations 数组中提供了预期的输出(对于前 3 个组合)。
非常感谢任何帮助!
$OriginalData = array();
$OriginalData[] = (object) array(
'ID'=>51,
'Options'=>array(
array('OptionID'=>27396,'Surcharge'=>50),
array('OptionID'=>27397,'Surcharge'=>40),
array('OptionID'=>27398,'Surcharge'=>45),
)
);
$OriginalData[] = (object) array(
'ID'=>52,
'Options'=>array(
array('OptionID'=>27383,'Surcharge'=>5),
array('OptionID'=>27384,'Surcharge'=>5),
array('OptionID'=>27385,'Surcharge'=>5),
array('OptionID'=>27386,'Surcharge'=>5),
array('OptionID'=>27387,'Surcharge'=>5),
)
);
$OriginalData[] = (object) array(
'ID'=>53,
'Options'=>array(
array('OptionID'=>27343,'Surcharge'=>12),
array('OptionID'=>27344,'Surcharge'=>15),
)
);
print_r($OriginalData);
$Variations[0]['Options'][51] = (object) array('OptionID'=>27396,'Surcharge'=>50);
$Variations[0]['Options'][52] = (object) array('OptionID'=>27383,'Surcharge'=>5);
$Variations[0]['Options'][53] = (object) array('OptionID'=>27343,'Surcharge'=>12);
$Variations[0]['Summary'] = (object) array('TotalSurcharge'=>67);
$Variations[1]['Options'][51] = (object) array('OptionID'=>27397,'Surcharge'=>40);
$Variations[1]['Options'][52] = (object) array('OptionID'=>27383,'Surcharge'=>5);
$Variations[1]['Options'][53] = (object) array('OptionID'=>27343,'Surcharge'=>12);
$Variations[1]['Summary'] = (object) array('TotalSurcharge'=>57);
$Variations[2]['Options'][51] = (object) array('OptionID'=>27398,'Surcharge'=>45);
$Variations[2]['Options'][52] = (object) array('OptionID'=>27383,'Surcharge'=>5);
$Variations[2]['Options'][53] = (object) array('OptionID'=>27343,'Surcharge'=>12);
$Variations[2]['Summary'] = (object) array('TotalSurcharge'=>62);
print_r($Variations);
解决方案
这是一个解决方案:
$OriginalData = array();
$OriginalData[] = (object) array(
'ID' => 51,
'Options' => array(
array('OptionID' => 27396, 'Surcharge' => 50),
array('OptionID' => 27397, 'Surcharge' => 40),
array('OptionID' => 27398, 'Surcharge' => 45),
)
);
$OriginalData[] = (object) array(
'ID' => 52,
'Options' => array(
array('OptionID' => 27383, 'Surcharge' => 5),
array('OptionID' => 27384, 'Surcharge' => 5),
array('OptionID' => 27385, 'Surcharge' => 5),
array('OptionID' => 27386, 'Surcharge' => 5),
array('OptionID' => 27387, 'Surcharge' => 5),
)
);
$OriginalData[] = (object) array(
'ID' => 53,
'Options' => array(
array('OptionID' => 27343, 'Surcharge' => 12),
array('OptionID' => 27344, 'Surcharge' => 15),
)
);
$variations = array();
$counts = array();
$combinations = [[]];
$length = count($OriginalData);
for ($i = 0; $i < $length; $i++) {
$counts[] = range(0, count($OriginalData[$i]->Options) - 1);
}
for ($count = 0; $count < $length; $count++) {
$tmp = [];
foreach ($combinations as $v1) {
foreach ($counts[$count] as $v2)
$tmp[] = array_merge($v1, [$v2]);
}
$combinations = $tmp;
}
$x = 0;
foreach ($combinations as $c) {
$totalsurcharge = 0;
for ($i = 0; $i < $length; $i++) {
$Variations[$x]['Options'][$OriginalData[$i]->ID] = (object) $OriginalData[$i]->Options[$c[$i]];
$totalsurcharge += $OriginalData[$i]->Options[$c[$i]]['Surcharge'];
}
$Variations[$x]['Summary'] = (object) array('TotalSurcharge' => $totalsurcharge);
$x++;
}
var_dump($Variations);
推荐阅读
- maven - 传递依赖不能正常工作
- python - 如何使用 Python3 和 ANTLR4 修改 java 源代码?
- python - 达到 100% 时更改条形颜色的优雅方式
- swift - 在 Swift 中为 Tensorflow 创建随机张量
- regex - 用于匹配文本中相同单词的正则表达式
- lua - “尝试使用 TweenService() 时,函数 Create 不是“UnionOperation”的成员
- ionic-framework - 在Android上点击通知时应用程序不显示
- sql - 如何检索已删除的表?
- javascript - 没有 Base64 的音频小书签
- linux - 将旧域的每个页面重定向到新域上的相同页面 URL