PHP извлекает все возможные комбинации из данных - PullRequest
1 голос
/ 14 марта 2019

Я хотел бы извлечь все возможные варианты данных в следующем массиве ($ OriginalData), как они расположены во втором массиве ($ Variations).

В данном случае есть 3 вопроса, но эта цифра является переменной. Вопрос 1 имеет 3 варианта, вопрос 2 имеет 5 вариантов, а вопрос 3 имеет 2 варианта.

Мне нужно получить массив объектов, которые содержат каждую возможную комбинацию ответов из 3 вопросов. В этом случае я считаю, что должно быть 30 возможных комбинаций. Я предоставил ожидаемый результат (для первых 3 комбинаций) в массиве $ 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),
    )
);

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

1 Ответ

0 голосов
/ 15 марта 2019

Вот решение:

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