Php 如何从该数组中获取所需的和
这是我目前拥有的代码:Php 如何从该数组中获取所需的和,php,Php,这是我目前拥有的代码: $required = 1.3; $stacks = 0; $remaining = $required; $whichtakes = []; $array_result = ['0.6', '0.5', '0.8', '0.7']; for($i = 0; $i < count($array_result); $i++) { if($array_result[$i] <= $required && $stacks + $array_
$required = 1.3;
$stacks = 0;
$remaining = $required;
$whichtakes = [];
$array_result = ['0.6', '0.5', '0.8', '0.7'];
for($i = 0; $i < count($array_result); $i++) {
if($array_result[$i] <= $required && $stacks + $array_result[$i] <= $required) {
$stacks += $array_result[$i];
echo $remaining -= $array_result[$i];
$whichtakes[] = $array_result[$i];
}
}
print_r($whichtakes);
这仅获取0.6和0.5(前两个值),并给出剩余值(总和为1.1,因此剩余0.2)。但是输入有两个值,其总和与my$required
值匹配:0.8和0.7
如何改进我的代码,使其能够找到这些值?如果没有可能的精确匹配,我希望得到一系列值,其总和尽可能接近,从而最小化剩余值。此算法将找到所有与
$required
值相加的对:
$required = 1.3;
$array_result = ['0.6', '0.5', '0.8', '0.7'];
$answers = [];
foreach ($array_result as $value) {
$remaining = $required - $value;
if (in_array((string)$remaining, $array_result)) {
$new_answer = ($value <= $remaining ? [$value, $remaining] : [$remaining, $value]);
$answers[] = $new_answer;
}
}
echo '<pre>';
print_r(array_unique($answers, SORT_REGULAR));
echo '</pre>';
在注释中进行了更多解释之后,结果表明您希望找到此输入/输出的算法: 输入:
- 总金额,以及
- 包含数量的数组
- “最近子集”:从输入数组(不一定是一对)中选择的数量,其最大和不大于给定总量
- 该子集之和与给定总额之间的差额
你的问题不清楚(至少对我来说)。期望的结果是什么?0.8+0.7==1.5,你为什么说这些值与你的
$required
==1.3精确匹配?你的标题提到了“最近的对”,但你的代码或描述中没有任何内容与查找最近的对有关。注意:你应该正确缩进你的代码。你永远不会重置循环中$stacks
和$remaining
的值。您的算法将不起作用。对不起,先生,它的工作非常完美,但没有什么变化,您的算法正在获得对,但我想要匹配我的结果数组的数组,只需要这一点变化。如果$required=1.3改为$required=1.8,现在应该给我数组0.6,0.5,0.7,如果$required=1.9,现在应该给我数组0.6,0.5,0.7和0.1剩余如果$required=0.5;和$array_result=[1];如果($whichtakes=0.5,重命名为0.5,而$whichtakes中没有任何内容,那么我认为它必须给我$whichtakes=0.5,重命名为0.5,如果($remaining>=$val)中的条件不成立,我们需要一个else语句吗??请指导我认为您最初的问题是,$whichtakes
应该从数组中获取值,因此在您的示例中它永远不可能是0.5:$array\u result
只有值1。是的,从数组中获取值,但它可以是数组中的一个结果,我正在使用从arrayelse if($剩余)获得的一个结果进行测试
$required = 1.3;
$array_result = ['0.6', '0.5', '0.8', '0.7'];
$answers = [];
foreach ($array_result as $value) {
$remaining = $required - $value;
if (in_array((string)$remaining, $array_result)) {
$new_answer = ($value <= $remaining ? [$value, $remaining] : [$remaining, $value]);
$answers[] = $new_answer;
}
}
echo '<pre>';
print_r(array_unique($answers, SORT_REGULAR));
echo '</pre>';
Array
(
[0] => Array
(
[0] => 0.6
[1] => 0.7
)
[1] => Array
(
[0] => 0.5
[1] => 0.8
)
)
// Input
$required = 1.3;
$array_result = [0.6, 0.5, 0.8, 0.7];
// Algorithm
$remainings = [(string)$required => []]; // Keyed by remaining value; gives array elements that have that remainder
foreach($array_result as $i => $val) {
foreach($remainings as $remaining => $whichtakes) {
if ($remaining >= $val) $remainings[(string)($remaining-$val)] = array_merge($whichtakes, [$val]);
}
}
$remaining = min(array_keys($remainings));
$whichtakes = $remainings[(string)$remaining];
// Output
print_r($whichtakes); // [0.6, 0.7]
print_r($remaining); // 0