注意:循环时未定义的偏移量会抛出一个带有foreach的对象数组


Notice: Undefined offset while looping throw an array of objects with foreach

我有以下对象数组:

Array
(
    [0] => Array
        (
            [0] => stdClass Object
                (
                    [Sales] => 4
                )
            [1] => stdClass Object
                (
                    [Sales] => 6
                )
            [2] => stdClass Object
                (
                    [Sales] => 5
                )
        )
    [1] => Array
        (
            [0] => stdClass Object
                (
                    [Sales] => 8
                )
            [1] => stdClass Object
                (
                    [Sales] => 7
                )
            [2] => stdClass Object
                (
                    [Sales] => 7
                )
        )
    [2] => Array
        (
            [0] => stdClass Object
                (
                    [Sales] => 5
                )
            [1] => stdClass Object
                (
                    [Sales] => 7
                )
            [2] => stdClass Object
                (
                    [Sales] => 6
                )
        )
    [3] => Array
        (
            [0] => stdClass Object
                (
                    [Sales] => 5
                )
            [1] => stdClass Object
                (
                    [Sales] => 6
                )
            [2] => stdClass Object
                (
                    [Sales] => 6
                )
        )
    [4] => Array
        (
            [0] => stdClass Object
                (
                    [Sales] => 4
                )
            [1] => stdClass Object
                (
                    [Sales] => 5
                )
            [2] => stdClass Object
                (
                    [Sales] => 11
                )
        )
)

我想获得每个对象的总销售额。所以我写了这段代码:

    public function getChannelsSales ($ChannelSales) {
        $totalChannelSales = array();
        $i = 0;
        foreach ($ChannelSales as $ChSales) {
            foreach ($ChSales as $value) {
                $totalChannelSales[$i] = $totalChannelSales [$i] + $value->Sales;
            }
            ++$i;
        }
        return $totalChannelSales;
}

运行代码后,我得到了正确的答案:

Array
(
    [0] => 15
    [1] => 22
    [2] => 18
    [3] => 17
    [4] => 20
)

但是,我也在呻吟声中收到以下消息:

Notice: Undefined offset: 0 in ...'Sales.php on line 174
Notice: Undefined offset: 1 in ...'Sales.php on line 174
Notice: Undefined offset: 2 in ...'Sales.php on line 174
Notice: Undefined offset: 3 in ...'Sales.php on line 174
Notice: Undefined offset: 4 in ...'Sales.php on line 174

第 174 行是这样的:

$totalChannelSales[$i] = $totalChannelSales[$i] + $value->Sales;

而且如果连答案都是正确的,我也不明白问题出在哪里(正如你可以自己总结的那样)

知道吗?

编辑:

我得到了一个解决方案,增加了两行

        $totalChannelSales[0] = 0;
  • 创建数组后和第一个 foreach 之前一次
  • 在第一个 foreach 结束后,两者之间的第二次

数组将从循环中逐个填充您的值。您不需要添加它。

使用以下代码。

$totalChannelSales[$i] = $value->Sales;

我想你的问题就在这里

$totalChannelSales[$i] = $totalChannelSales [$i] + $value->Sales;

您正在尝试设置甚至不存在的索引,您可以使用array_push,它将推送元素并迭代索引。

我将引导您完成代码以找出错误:

foreach ($ChannelSales as $ChSales) {
        foreach ($ChSales as $value) {
            $totalChannelSales[$i] = $totalChannelSales [$i] + $value->Sales;
        }
        ++$i;
    }

现在在上面的代码中,假设在 $i = 0 时您处于第一个循环中,此时$totalChannelSales[$i] = $totalChannelSales [$i] + $value->Sales;将被$totalChannelSales[0] = $totalChannelSales [0] + $value->Sales;,因此它将获取$totalChannelSales [0] 值,该值此时不存在,对于 $i 的其他值也是如此。

$totalChannelSales[$i] = $totalChannelSales [$i] + $value->Sales;

在上面的代码中,右侧没有为$totalChannelSales [$i]定义任何值。您只需要下面的分配。

$totalChannelSales[$i] = $value->Sales;

已编辑:

我引入了一个临时变量$tempsum它将删除所有未定义的问题。

public function getChannelsSales ($ChannelSales) {
    $totalChannelSales = array();
    $i = 0;
    foreach ($ChannelSales as $ChSales) {
        $tempsum = 0;
        foreach ($ChSales as $value) {
            $tempsum += $value->Sales;
        }
       $totalChannelSales[$i] = $tempsum;
       $i++;
    }
   return $totalChannelSales;
}