【问题标题】:PHP extract all possible combinations from dataPHP 从数据中提取所有可能的组合
【发布时间】:2019-08-05 11:33:21
【问题描述】:

我想将以下数组 ($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);

【问题讨论】:

    标签: php loops recursion iterator


    【解决方案1】:

    这里有一个解决方案:

    $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);
    

    【讨论】:

      猜你喜欢
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多