我有一个像这样的数组:
$arr = array(25, 30, 50, 15, 20, 30);
我想获取所有值合计的键,100
或者如果合计100
不可能,则意味着将获取小于的键100
。
我需要总共100赞
> $array[2]+$array[4]+$array[5]=100
我的实际需求是要达到100种组合
最后我明白了。可能有更好的解决方案,但是它可以工作...
您的问题很复杂。具有6个条目的数组可能有720个唯一排列。条目越多意味着组合越多。因此,我首先获得所有唯一的置换,然后为每种组合计算低于或等于一百的可能性。
$array = array(25, 30, 50, 15, 20, 30);
// 'permutations' function can be found at the bottom of my post
$permutations = permutations(array_keys($array));
$combinations = array();
foreach( $permutations as $keys ) {
$current = array("sum" => 0, "keys" => array());
foreach( $keys as $key ) {
if( $current["sum"] + $array[$key] <= 100 ) {
$current["sum"] += $array[$key];
$current["keys"][] = $key;
}
}
// order the keys and create a hash of them
// to be sure each combination only exists once in the result
sort($current["keys"]);
$combinations[md5(join("", $current["keys"]))] = $current;
}
// remove the hashes from array when finished
$combinations = array_values($combinations);
// the final result
print_r($combinations);
对于您的阵列,有11种可能的组合。结果将是:
Array (
[0] => Array (
[sum] => 90
[keys] => Array (
[0] => 0
[1] => 1
[2] => 3
[3] => 4
)
)
[1] => Array (
[sum] => 90
[keys] => Array (
[0] => 0
[1] => 2
[2] => 3
)
)
[2] => Array (
[sum] => 95
[keys] => Array (
[0] => 1
[1] => 2
[2] => 3
)
)
[3] => Array (
[sum] => 95
[keys] => Array (
[0] => 0
[1] => 2
[2] => 4
)
)
[4] => Array (
[sum] => 100
[keys] => Array (
[0] => 1
[1] => 2
[2] => 4
)
)
[5] => Array (
[sum] => 85
[keys] => Array (
[0] => 2
[1] => 3
[2] => 4
)
)
[6] => Array (
[sum] => 100
[keys] => Array (
[0] => 0
[1] => 1
[2] => 3
[3] => 5
)
)
[7] => Array (
[sum] => 95
[keys] => Array (
[0] => 2
[1] => 3
[2] => 5
)
)
[8] => Array (
[sum] => 100
[keys] => Array (
[0] => 2
[1] => 4
[2] => 5
)
)
[9] => Array (
[sum] => 90
[keys] => Array (
[0] => 0
[1] => 3
[2] => 4
[3] => 5
)
)
[10] => Array (
[sum] => 95
[keys] => Array (
[0] => 1
[1] => 3
[2] => 4
[3] => 5
)
)
)
使用的permutations
功能基于php Cookbook,但更改了您的四个需求。
function permutations($array, $permutations = array()) {
if( !empty($array) ) {
$result = array();
for( $i = count($array) - 1; $i >= 0; --$i ) {
$newItems = $array;
$newPerms = $permutations;
list($values) = array_splice($newItems, $i, 1);
array_unshift($newPerms, $values);
$result = array_merge($result, permutations($newItems, $newPerms));
}
}
else {
$result = array($permutations);
}
return $result;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句