【问题标题】:PHP 2D array failurePHP 2D 数组失败
【发布时间】:2019-04-29 18:49:00
【问题描述】:

我觉得问这个很愚蠢,因为我觉得我应该能够解决这个问题,但可惜我在这上面花费了太多时间并且感到沮丧,所以我想我会请求一些帮助。我有一个如下所示的 PHP 数组。这只是一个示例,因为该项目正在进行中:

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

我已经多次尝试嵌套 for 和 foreach 循环来尝试获取值,我可以接近,但我似乎总是遇到不同的障碍。例如,我曾经将年份和月份作为子数组的一部分。我能够使用 for 然后 foreach 循环成功提取所有值,但我无法弄清楚如何排除 foreach 中的前两个元素(年和月)。这是最终目标...

每个子数组都包含以美元为单位的个人会员捐款。随着更多捐款的进入,该阵列可能会在本月增长,但一旦该月滚动,下个月的子阵列开始填充捐款,并且上个月被“存档”。我需要对每个子数组的所有捐款求和,并让每个值都可以表示为百分比(四舍五入到最接近的整数),作为显示在网页上的条形图的一部分。

谁能帮我确定我的流程吗?

这是我最初尝试的。这是使用较旧的 uglier 数组。需要注意的是,这个版本目前没有四舍五入到最接近的整数。还没有弄清楚那部分。这些数字在这个例子中很好地锻炼了。此外,如果您好奇,$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;
    }
}

这有点工作,但同样,我的逻辑在这里有严重缺陷,而且这种方法有一些非常严重的错误。例如,这些数组从前几个月不断地相互添加。每个月他们都需要重置为默认值。请注意在屏幕截图中,12 月实际上是 12 月和 11 月的总和,然后又继续?此外,我还喜欢能够将月份和年份添加到数组中,这是该版本无法处理的。我需要一些严肃的指导和例子来说明正确的方法。我知道的 PHP 足够危险!

谢谢!

【问题讨论】:

  • 百分比是否应该是该月总数占所有月份总数的百分比?
  • 在此示例中,总计表示每月的运行费用。几个月之间完全没有重叠。也就是说,每月保持运行需要花费 100 美元。在这个例子中,15%(15 美元)是在 11 月份捐赠的。现在,我知道我们还没有到 12 月,但这只是一个例子。从技术上讲,根据阵列,12 月份捐赠了 50 美元,但显示不正确。将 12 月的 50 美元与 11 月的 15 美元相加。有意义吗?所有这些都是让会员了解我们当前(和未来)月份是否有充足资金的简单方法。
  • $sum = 0; 放在foreach($donate[$keydonate 之前以在下个月计算开始前重置总和

标签: php arrays for-loop multidimensional-array


【解决方案1】:

我希望给我这个答案的原始人不会删除他的帖子。解决方案是正确的!我只需要稍作修改以适应我的目的。这是带有屏幕截图的工作解决方案。谢谢神秘用户!也感谢其他人的时间和提交。

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

我决定允许保留两位小数,并决定加入一些简单的限制以防止条形图溢出。理想情况下,一旦一个月资金充足,剩余的资金就会溢出到下个月,但目前我将手动处理。稍后将致力于额外的自动化。很高兴最初启动并运行它。谢谢!

【讨论】:

    【解决方案2】:

    你真的很亲密。

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

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

    【讨论】:

    • 马上测试。目前正在尝试其他建议(由于某种原因刚刚被删除)。谢谢!
    • 不客气!我想也许他们删除了另一个答案,因为它是根据所有值的总和而不是像您使用的固定数字计算百分比。他们可以编辑它并取消删除。
    【解决方案3】:

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

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

    这就是您想要的吗? 输出:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-28
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      相关资源
      最近更新 更多