さて、これを行う「適切な」方法を見逃したかもしれませんが、それでもいくつかの解決策があります。
無限探索 - 試行 2 (推奨):
function get_parts3($arr,$target)
{
foreach($arr as $k => $v)
{
if($v>$target) continue;
foreach($arr as $k2 => $v2)
{
if($v2>$target) continue;
if($k2==$k) continue;
if($v + $v2 == $target)
{
return array($k,$k2);
}
}
$tmparr = $arr;
$tmparr[$k] = $target+1;
$test = get_parts3($tmparr,$target-$v);
if(is_array($test))
{
return array_merge(array($k),$test);
}
}
return false;
}
試行された無限検索 1 - ただし、大きな配列ではパフォーマンスの問題が発生する可能性があります。
function get_parts2($arr,$target)
{
foreach($arr as $k => $v)
{
if($v > $target) continue;
$keys = array_keys($arr);
for($i=0;$i<25;$i++)
{
$sum = $v;
$parts = array();
$parts[$k] = $v;
foreach($keys as $k2)
{
if($k2 == $k) continue;
$v2 = $arr[$k2];
if($sum+$v2 > $target) continue;
$sum += $v2;
$parts[$k2] = $v2;
if($sum==$target) return array_keys($parts);
}
shuffle($keys);
}
}
return false;
}
有限検索 (この場合、2 つまたは 3 つの数字の組み合わせ) :
function get_parts($arr,$target)
{
foreach($arr as $k => $v)
{
if($v>$target) continue;
foreach($arr as $k2 => $v2)
{
if($v2>$target) continue;
if($k2==$k) continue;
if($v + $v2 == $target)
{
return array($v,$v2);
}
foreach($arr as $k3 => $v3)
{
if($v3>$target) continue;
if($k3==$k2 || $k3==$k) continue;
if($v + $v2 + $v3 == $target)
{
return array($k,$k2,$k3);
}
}
}
}
return false;
}