Php 在遍历对象时获取递减总计

Php 在遍历对象时获取递减总计,php,arrays,Php,Arrays,我正在遍历一个具有可变行数的数组/对象,其中一个参数是numberic。数组是按顺序排列的,因此这些数字是递减的(最高的优先) 例75、54、46、31、25、22、22、13、8、7、2 现在,在遍历数组时,我想基于这些数字构建另一个数组(“总计”) 我希望第一个值是所有数字的和,第二个值是第二个到最后一个数字的和,第三个值是第三个到最后一个数字的和,等等 因此,上述示例的结果将是: $totals[1] = 305 $totals[2] = 230 $totals[3] = 176 $tot

我正在遍历一个具有可变行数的数组/对象,其中一个参数是numberic。数组是按顺序排列的,因此这些数字是递减的(最高的优先)

例75、54、46、31、25、22、22、13、8、7、2

现在,在遍历数组时,我想基于这些数字构建另一个数组(“总计”)

我希望第一个值是所有数字的和,第二个值是第二个到最后一个数字的和,第三个值是第三个到最后一个数字的和,等等

因此,上述示例的结果将是:

$totals[1] = 305
$totals[2] = 230
$totals[3] = 176
$totals[4] = 130
$totals[5] = 99
。。。 等

由于源对象的键不是递增的,因此需要在for/while循环中完成

我可以使用嵌套循环中使用计数器的10亿if/+=语句来实现这一点,但它不是非常高效/动态的。我相信有一个简单的方法。我就是搞不懂


谢谢

非常容易做到–如果您只是反转数据数组,将这些反转的值相加,然后循环到$totals数组中,然后再次反转:

$data = array(75, 54, 46, 31, 25, 22, 22, 13, 8, 7, 2);
$data_rev = array_reverse($data);

$totals = array();
$sub_total = 0;

foreach($data_rev as $val) {
  $sub_total += $val;
  $totals[] = $sub_total;
}
$totals = array_reverse($totals);
print_r($totals);
($totals在这里以0开始编号,而不是像您的示例代码中那样以1开始编号–索引以0开始是常见的情况,因此我想这应该可以满足您的需要。)

当然,您不需要实际反转数组,您也可以简单地使用
for
循环向后遍历它(假设它只是以数字索引,从0开始,索引中没有“孔”):

我将添加整个阵列的第二个(克隆)。像这样:

<?php

$total = 0;
$sortedarray = rsort($totals);

$tmptotal = $sortedarray;

foreach($sortedarray AS $key => $value) {
    $total += array_sum($tmptotal);
    unset($tmptotal[$key]);
}

echo $total;

啊!数组_sum…未设置,谢谢。但我为什么要重新排序数组?我不想在每个数组求和之前取消设置第一个/最大值吗?排序会将数组从高到低排序。我的错。我认为rsort是“与”相反的顺序,而不是“按降序排序”。它应该被称为“dsort”:)因为它们已经按降序排列了,所以我可能无论如何都不需要进行rsort。再次感谢!谢谢我真的不能向后遍历初始循环,因为它实际上是一个复杂的对象,必须按照最初的排序顺序进行处理。所以,无论我使用哪种方法,我想我都必须在第一个循环中创建一个新的值数组,然后从那里开始。我必须测试这两种方法(你的和Jordi的(下面)),看看哪一种更有效。虽然我猜在5-10行上差异不大:)
<?php

$total = 0;
$sortedarray = rsort($totals);

$tmptotal = $sortedarray;

foreach($sortedarray AS $key => $value) {
    $total += array_sum($tmptotal);
    unset($tmptotal[$key]);
}

echo $total;