PHP中的新数组搜索SUM

时间:2015-03-04 11:22:26

标签: php arrays

我的数组结构类似于

$a = array("100","200","350"); 
$b = 400; // Is not a array is the finding value;

我想从数组中找到400和,这意味着400是一个值是100 + 200 + 100(350-100)的总和然后返回数组将是

$z = array("0","0","250");

这可能吗?

3 个答案:

答案 0 :(得分:0)

这样的东西?

$a = array("100","200","350"); 
$b = 400; // Is not a array is the finding value;

$left = $b;
$new_array = [];
for($i=0;$i<count($a);$i++)
{
    $new_value[] = max($a[$i]-$left, 0);
    $left = max($left - $a[$i], 0);
}

var_dump($new_value);

http://3v4l.org/d87rs

答案 1 :(得分:0)

array_walk可能是一个不错的选择。使用引用,这样您就不必使用额外的内存。如果你有更大的数据,那就更好了。

<?php

//init
$a = array("100","200","350");
$b = 400; 

//walk the array. Pass by reference.
array_walk($a, function(&$item) use (&$b){
    $tmpItem = $item;
    $item = (($b-$item)>0)?0:$item-$b;
    $b-=$tmpItem;
});

//debug
print_r($a);

&GT;

输出:

Array
(
    [0] => 0
    [1] => 0
    [2] => 250
)

答案 2 :(得分:0)

虽然array_walk()似乎是这项工作的最佳工具,但我不想修改原始数组,而是生成一个新数组。

对于这种方法,array_reduce()是其中一种方法:

$a = array("100","200","350");
$b = 400;

$z = array_reduce(
    $a,                               // process $a
    function(array $carry, $item) use (& $b) {
        // Cannot subtract from $item more than its value
        $sub = min($item, $b);
        // Subtract from $item and put it into the result array
        $item   -= $sub;
        $carry[] = $item;
        // Update the remainder
        $b -= $sub;
        // Return the partial result
        return $carry;
    },
    array()                           // start with an empty list
);

代码运行后,$z包含所需的值列表,$b包含余数。如果$b大于0,则$z中的所有值均为0$b包含$barray_sum($a)之间的差异}。如果$b0,则$a中的值足以覆盖它,$z中返回的值是余数。