PHP 2D阵列故障

时间:2018-11-27 23:14:20

标签: php arrays for-loop multidimensional-array

我很想问这个问题,因为我觉得自己应该能够解决这个问题,但是可惜我在这上面花了太多时间,感到沮丧,所以我想寻求帮助。我有一个如下所示的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;
    }
}

这有点奏效,但是同样,我的逻辑在这里有严重缺陷,并且该方法有一些非常严重的错误。例如,阵列从前几个月开始彼此增加。他们每个月都需要重置为默认值。请注意,在屏幕截图中,十二月实际上是十二月和十一月的总和,然后又是又一个又一个呢?另外,我也希望能够将月份和年份也添加到数组中,而该版本无法处理。我需要一些认真的指导和示例,以帮助您找到正确的方法。我知道足够多的PHP才是危险的!

谢谢!

Progress bars

3 个答案:

答案 0 :(得分:1)

你真的很亲近。

您尝试的代码无法正常工作的唯一原因似乎是您没有将每个月的总和重置为零。

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循环来迭代数组。对于执行固定次数的操作,for循环通常更好。而且,计算内部循环中的百分比有点浪费(您需要对内部数组中的每个数字重新计算它,但只能使用最后一个数字来重新计算)。您可以在循环结束后进行计算。

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

或更妙的是,使用内置函数求和内部数组而不是另一个循环。

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

答案 1 :(得分:1)

我像您说的那样将月份和年份添加到了数组中,并制作了这个小脚本,该脚本似乎可以正确地执行您的要求。

<?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";
}

这还不是您想要的吗? 输出: enter image description here

答案 2 :(得分:0)

我希望给我这个答案的那个原始人不会删除他的帖子。解决方法是正确的!我只需要稍作修改即可适合我的目的。这是带有屏幕截图的有效解决方案。谢谢神秘用户!也感谢其他所有人的时间和意见。

<?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 />";
        };
    ?>

enter image description here

我决定允许两位小数,并决定包括一些简单的限制以防止条形图溢出。理想情况下,一个月一旦有足够的资金,其余的将溢出到下个月,但暂时我将手动处理。以后将用于其他自动化。最初启动并运行它真是太好了。谢谢!