【问题标题】:Php, sum values in foreach loopPhp,foreach 循环中的总和值
【发布时间】:2016-06-16 11:30:02
【问题描述】:

在以下示例中,我无法摆脱“注意:未定义的索引:总数”:

stdClass Object
(
    [1] => stdClass Object
        (
            [name] => How do you find our site?
            [id] => 1
            [values] => stdClass Object
                (
                    [0] => stdClass Object
                        (
                            [value] => Piece of cake
                            [count] => 10
                        )

                    [3] => stdClass Object
                        (
                            [value] => Very Easy
                            [count] => 20
                        )

                    [4] => stdClass Object
                        (
                            [value] => Easy
                            [count] => 30
                        )

                    [6] => stdClass Object
                        (
                            [value] => Hard
                            [count] => 40
                        )

                )

            [totalcount] => 100
        )

    [2] => stdClass Object
        (
            [name] => What is your favourite color?
            [id] => 2
            [values] => stdClass Object
                (
                    [1] => stdClass Object
                        (
                            [value] =>Green
                            [total] => 0
                        )

                    [2] => stdClass Object
                        (
                            [value] => Blue
                            [total] => 0
                        )

                    [5] => stdClass Object
                        (
                            [value] => Red
                            [total] => 0
                        )

                    [7] => stdClass Object
                        (
                            [value] => Black
                            [total] => 0
                        )

                )

            [totalcount] => 0
        )
)

然后我使用foreach循环数组根据名称值进行排序:

  foreach ($array as $i => $row) {
      if ($id != $row->id) {
          $id = $row->id;
          $data[$row->id]['name'] = $row->question;
          $data[$row->id]['id'] = $row->id;
      }
      $data[$row->id]['opts'][$i]['value'] = $row->value;
      $data[$row->id]['opts'][$i]['count'] = $row->total;
      $data[$row->id]['totalcount'] += $data[$row->id]['opts'][$i]['count'];
  }

但在此处不断收到索引通知“$data[$row->id]['totalcount'] += $data[$row->id]['opts']” 我不知道如何解决这个问题。结果都是正确的,只是特定行的问题。

我只需要将“count”的所有值相加并作为单个值分配给totalcount

感谢任何帮助。

【问题讨论】:

  • 在 foreach 开始时初始化一个空的 totalcount$data[$row->id]['totalcount'] = 0; - 此外,您可以将 $row->total 添加到 totalcount,节省一些复杂性和字符。
  • 即使使用 $data[$row->id]['totalcount'] += $row->total,仍然会收到通知。
  • $data 来自哪里???

标签: php foreach sum


【解决方案1】:

该通知是由于 $data[$row->id]['totalcount'] 在您尝试添加之前未初始化。在这种情况下,通知不会影响结果,但 PHP 想让你知道发生了什么。

删除通知的最简单方法是在切换当前 ID 时为该变量添加一个初始化行,但只有在确定不会从第 1 行切换到第 2 行时才能这样做并再次回到第 1 行(或类似的东西)。为此,请添加

$data[$row->id]['totalcount'] = 0;

给你的

if ($id != $row->id)

阻止。

最万无一失的解决方案就是将初始化行与isset()结合起来。

例子:

if (isset($data[$row->id]['totalcount']))
{
    $data[$row->id]['totalcount'] += $data[$row->id]['opts'][$i]['count'];
}
else
{
    $data[$row->id]['totalcount'] = $data[$row->id]['opts'][$i]['count'];
}

【讨论】:

  • 感谢您的建议,但如果我添加 "$data[$row->id]['totalcount'] = 0;"在 "if ($id != $row->id)" 之后,计数是错误的。 totalcount 变成 2 和 0,应该是 100 和 0
  • @Alko 确保初始化发生在 if 块内。还要记住我上面的注释:只有当行 ID 是连续的时,此设置才能正常工作。如果您在行 ID 1 和行 ID 2 之间来回跳转,它将不起作用,因为每当 ID 更改时,该 ID 的总计数也将被重置。如果您不能保证行 ID 是连续的,则只需进行简单的 isset 检查即可。
  • 我第一次使用 isset 时,没有用,但由于某种原因,它现在可以用了。一定是我的错字。非常感谢。
【解决方案2】:

而不是

$data[$row->id]['totalcount'] += $data[$row->id]['opts'][$i]['count'];

我会这样做

$data[$row->id]['totalcount'] = !isset($data[$row->id]['totalcount']):0?$data[$row->id]['totalcount'] + $data[$row->id]['opts'][$i]['count'];

【讨论】:

  • 仍然不好我现在以 22 和 0 而不是 100 和 0 作为总数。你逆转了?和:在你的例子中。
猜你喜欢
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 2021-08-01
  • 1970-01-01
  • 2010-12-22
  • 2016-09-26
相关资源
最近更新 更多