Do użycia funkcja findComponents(), jeżeli możliwa jest kombinacja unikalnych składników zwróci ją lub false w przypadku braku takiej kombinacji. Choć wydaje mi się że skrypt ma wadę bo leci od największych składników przez co nie wszystkie kombinacje są możliwe :/
edit: jednak nie działa w pełni poprawnie, wysypuje się na floatach ale może Cię to na coś naprowadzi, tak na prawdę to potrzebny tu jest jedynie sensowny algorytm, przełożenie go na kod to już formalność.
$acceptable = [1, 1.25, 1.5, 2, 2.5, 3, 5, 10, 15, 20];
print_r(findComponents
(18
, $acceptable));
function findComponents($search, $acceptable){
$components = findComponentsR($search, $acceptable);
return array_sum($components) == $search ?
$components : false; }
function findComponentsR($search, $acceptable, $originalSearch=null, $components=[]){
return $components;
}
foreach ($acceptable as $k => $v) {
if ($v > $search) {
} elseif($v == $search) {
return [$v];
}else{
$components[] = $v;
if(!empty($acceptable)) { $components = array_merge($components, findComponentsR
($search - $v, $acceptable, $originalSearch, $components)); break;
}
}
}
}