PHP 2D数组失败

PHP 2D数组失败,php,arrays,for-loop,multidimensional-array,Php,Arrays,For Loop,Multidimensional Array,我觉得问这个问题很愚蠢,因为我觉得我应该能够弄明白这一点,但唉,我花了太多时间在上面,感到沮丧,所以我想我会请求一些帮助。我有一个PHP数组,如下所示。这只是一个例子,因为该项目是一项正在进行的工作: $donations = array( "2018 December" => array('30','20','100'), "2018 November" => array('10','5','200','1000') ); 我已经多次尝试嵌套for和foreach

我觉得问这个问题很愚蠢,因为我觉得我应该能够弄明白这一点,但唉,我花了太多时间在上面,感到沮丧,所以我想我会请求一些帮助。我有一个PHP数组,如下所示。这只是一个例子,因为该项目是一项正在进行的工作:

$donations = array(
    "2018 December" => array('30','20','100'),
    "2018 November" => array('10','5','200','1000')
);
我已经多次尝试嵌套for和foreach循环,试图获取值,我可以接近,但我似乎总是遇到不同的障碍。例如,我曾经将年和月作为子数组的一部分。我能够使用for和foreach循环成功地提取出所有的值,但是我不知道如何排除foreach中的前两个元素(年和月)。这是最终的目标

每个子数组包含以美元表示的单个成员捐款。当收到更多捐赠时,阵列在当月可能会增加,但一旦该月结束,下个月的子阵列将开始填充捐赠,上个月将“存档”。我需要将每个子数组的所有捐款相加,并将每个值表示为百分比(四舍五入到最接近的整数),作为显示在网页上的条形图的一部分

有人能帮我确定我的流程吗

这是我最初尝试的。这是使用较旧的丑陋阵列。应该注意的是,这个版本目前并没有四舍五入到最接近的整数。我也还没弄明白那部分。在本例中,这些数字很好地发挥了作用。此外,如果您感到好奇,$total将在页面的不同部分单独计算$total=集团每月的运营成本,但在本例中,我手动将其设置为$100

$donate = array(
    array("5","10"),
    array("20","30"),
    array("0"),
    array("0"),
    array("0")
);

$keydonate = array_keys($donate);
$taco = array();
for($i = 0; $i < count($donate); $i++) {
    foreach($donate[$keydonate[$i]] as $value) {
        $sum = $sum + $value;
        $taco[$i] = ($sum/$total)*100;
    }
}
$provate=array(
数组(“5”、“10”),
数组(“20”、“30”),
数组(“0”),
数组(“0”),
数组(“0”)
);
$KEYOVERATE=数组_键($OVERATE);
$taco=array();
对于($i=0;$i<计数($捐赠);$i++){
foreach($PRODATE[$KEYPRODATE[$i]]作为$value){
$sum=$sum+$value;
$taco[$i]=($sum/$total)*100;
}
}
这是可行的,但我的逻辑在这里有严重的缺陷,这个方法有一些相当严重的错误。例如,阵列从前几个月开始不断增加。每个月他们都需要重置为默认值。注意,在屏幕截图中,12月实际上是12月和11月的总和,然后继续?此外,我还喜欢将月份和年份添加到数组中,这是这个版本无法处理的。我需要一些认真的指导和正确的方法做这方面的例子请。我只知道足够危险的PHP

谢谢大家!

你真的很接近

看起来您尝试的代码不起作用的唯一原因是您没有将每个月的总和重置为零

for($i = 0; $i < count($donate); $i++) {
    $sum = 0;                                        // <----- Like this
    foreach($donate[$keydonate[$i]] as $value) {
        $sum = $sum + $value;
        $taco[$i] = ($sum/$total)*100;
    }
}
或者更好,使用内置函数对内部数组求和,而不是另一个循环

foreach ($donate as $month => $values) {
    $taco[$month] = array_sum($values) / $total * 100;
}
你真的很接近

看起来您尝试的代码不起作用的唯一原因是您没有将每个月的总和重置为零

for($i = 0; $i < count($donate); $i++) {
    $sum = 0;                                        // <----- Like this
    foreach($donate[$keydonate[$i]] as $value) {
        $sum = $sum + $value;
        $taco[$i] = ($sum/$total)*100;
    }
}
或者更好,使用内置函数对内部数组求和,而不是另一个循环

foreach ($donate as $month => $values) {
    $taco[$month] = array_sum($values) / $total * 100;
}

我像你说的那样将月份和年份添加到数组中,并制作了这个小脚本,如果我正确理解了你的问题,它似乎可以满足你的要求

<?php
        //Enter your code here, enjoy!

$donations = array(
    array('2018', 'December', '30','20','100'),
    array('2018', 'November', '10','5','200','1000')
);

$total = 75;


$taco = array();
for($i = 0; $i < count($donations); $i++) {
    $sum = 0;
    for($j = 2; $j < count($donations[$i]); $j++) {
        $sum += $donations[$i][$j];
        }
        //echo $sum." ";
    $taco[$i] = ($sum/$total)*100;
}

for($i = 0; $i < count($donations); $i++){
    echo "Month ". $donations[$i][0]." ".$donations[$i][1]." raised ".$taco[$i]." % of monthly costs."."\r\n";
}

我按照您所说的那样将月份和年份添加到数组中,并制作了这个小脚本,如果我正确理解了您的问题,它似乎可以满足您的要求

<?php
        //Enter your code here, enjoy!

$donations = array(
    array('2018', 'December', '30','20','100'),
    array('2018', 'November', '10','5','200','1000')
);

$total = 75;


$taco = array();
for($i = 0; $i < count($donations); $i++) {
    $sum = 0;
    for($j = 2; $j < count($donations[$i]); $j++) {
        $sum += $donations[$i][$j];
        }
        //echo $sum." ";
    $taco[$i] = ($sum/$total)*100;
}

for($i = 0; $i < count($donations); $i++){
    echo "Month ". $donations[$i][0]." ".$donations[$i][1]." raised ".$taco[$i]." % of monthly costs."."\r\n";
}

好吧,我希望给我这个答案的那个人不会删除他的帖子。答案是正确的!我只是需要做一点小小的修改来适应我的目的。这是一个带有屏幕截图的工作解决方案。谢谢神秘用户!谢谢大家的时间和意见

<?php
    //------------ MEMBER DONATIONS ------------
    $donations = [
        "2019 March" => ['100','8.61'],
        "2019 February" => ['0.12','0.45','1.76','4.23','1.23','9.34','2.34','1.23','5.55','9.21'],
        "2019 January" => ['10','10','10','10','5'],
        "2018 December" => ['0'],
        "2018 November" => ['10']
    ];
    //------------------------------------------

    $totalSum = 0;
    $monthlySums = [];
    $monthlyPercentages = [];
    foreach($donations as $month => $values) {
        $monthlySums[$month] = array_sum($values);
        $totalSum += $monthlySums[$month];
    }
    foreach($monthlySums as $month => $monthlySum) {
        $monthlyPercentages[$month] = round($monthlySum / $total * 100,2);
        if($monthlyPercentages[$month] > 100){
            $monthlyPercentages[$month] = 100;
        }
    }
?>

然后是HTML

    <?php
        foreach(array_keys($donations) as $month) {
            echo "<div class='prog-font'>". $month ."</div><div class='prog-cont'><div class='prog-fill' style='width:". $monthlyPercentages[$month] ."%'><span style='padding-left: 5px;'>". $monthlyPercentages[$month] ."%</span></div></div><div class='prog-goal'>Operating Expenses $". $total ."</div><br />";
        };
    ?>

好吧,我希望给我这个答案的那个人不会删除他的帖子。答案是正确的!我只是需要做一点小小的修改来适应我的目的。这是一个带有屏幕截图的工作解决方案。谢谢神秘用户!谢谢大家的时间和意见

<?php
    //------------ MEMBER DONATIONS ------------
    $donations = [
        "2019 March" => ['100','8.61'],
        "2019 February" => ['0.12','0.45','1.76','4.23','1.23','9.34','2.34','1.23','5.55','9.21'],
        "2019 January" => ['10','10','10','10','5'],
        "2018 December" => ['0'],
        "2018 November" => ['10']
    ];
    //------------------------------------------

    $totalSum = 0;
    $monthlySums = [];
    $monthlyPercentages = [];
    foreach($donations as $month => $values) {
        $monthlySums[$month] = array_sum($values);
        $totalSum += $monthlySums[$month];
    }
    foreach($monthlySums as $month => $monthlySum) {
        $monthlyPercentages[$month] = round($monthlySum / $total * 100,2);
        if($monthlyPercentages[$month] > 100){
            $monthlyPercentages[$month] = 100;
        }
    }
?>

然后是HTML

    <?php
        foreach(array_keys($donations) as $month) {
            echo "<div class='prog-font'>". $month ."</div><div class='prog-cont'><div class='prog-fill' style='width:". $monthlyPercentages[$month] ."%'><span style='padding-left: 5px;'>". $monthlyPercentages[$month] ."%</span></div></div><div class='prog-goal'>Operating Expenses $". $total ."</div><br />";
        };
    ?>

百分比是否应该是该月总额占所有月份总额的百分比?在本例中,总额表示每月的运行费用。两个月之间根本没有重叠。我说每月维持跑步要花100美元。在这个例子中,15%(15美元)是在11月份捐赠的。现在,我知道我们还没有到12月,但这只是一个例子。从技术上讲,根据阵列,12月份捐赠了50美元,但显示不正确。它将12月的50美元与11月的15美元相加,有意义吗?所有这些对于会员来说都是一个简单的方法,可以查看我们在当前(和未来)月份的资金是否充足在<代码>foreach($s)之前[$keydovate
要在下个月开始计算之前重置总和,百分比应该是该月总数占所有月份总数的百分比吗?在本例中,总数表示每月的运行费用。月份之间没有重叠。例如,保持运行需要花费$100每月。在本例中为15%(15美元)是在11月份捐赠的。现在,我知道我们还没有到12月份,但这只是一个例子。从技术上来说,根据数组,12月份捐赠了50美元,但显示不正确。它将12月份的50美元与11月份的15美元相加。有意义吗?所有这些都是一个简单的方法,让会员们看看我们是否当前(和未来)月的全部资金。将$sum=0;
放在每个($PROVATE[$KEYPROVATE
之前,以便在下个月计算之前重置金额