我的数组结构类似于
$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");
这可能吗?
答案 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);
答案 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
包含$b
和array_sum($a)
之间的差异}。如果$b
为0
,则$a
中的值足以覆盖它,$z
中返回的值是余数。