PHP foreach 循环未定义的属性/索引通知,同时将值设置为 stdclass 属性或数组变量

php foreach loop undefined property / index notice while setting value to stdclass property or array variable

提问人:Code Lover 提问时间:12/29/2020 最后编辑:Code Lover 更新时间:12/29/2020 访问量:550

问:

在foreach循环中,我正在尝试为源数组或对象添加一些附加属性。这给了我以下通知。

注意:未定义的属性:stdClass::$total

foreach ($this->products as $p_row) {
    $this->data[ $p_row->group_id ][] = $p_row;
    // getting index error here
    $p_row->total += gs_get_product_qty_price($p_row->product, $p_row->qty);
}

但是,如果我添加注释,错误就会消失。@

foreach ($this->products as $p_row) {
    $this->data[ $p_row->group_id ][] = $p_row;
    // adding @ the error gone
    @$p_row->total += gs_get_product_qty_price($p_row->product, $p_row->qty);
}

据我了解,在第一次迭代中,它没有定义;也许这就是显示错误的原因。

谁能向我解释一下以清除我的想法,是否可以使用以避免错误?@

如果我尝试在

注意:未定义索引:总计

$this->data[$p_row->group_id]['total'] += gs_get_product_qty_price($p_row->product, $p_row->qty);

这是解决方案吗?

foreach ($this->products as $p_row) {

    $p_row->total = 0;

    $this->data[ $p_row->group_id ][] = $p_row;
    $p_row->total                     += gs_get_product_qty_price($p_row->product, $p_row->qty);

}
php 未定义索引

评论

0赞 M. Eriksson 12/29/2020
您需要做的就是在循环之前定义属性。.您真的应该避免使用,因为这会使调试变得非常痛苦(因为它会抑制您在调试时想要的任何潜在错误消息。$p_row->total = 0;@
0赞 Code Lover 12/29/2020
@MagnusEriksson我明白了,但仅在循环中可用。如何在循环外定义它?$p_row
1赞 M. Eriksson 12/29/2020
啊,是的,你是对的。好吧,如果这些属性在循环之前不存在,你可以简单地使用 而不是在循环中定义它。如果使用 ,则会增加现有值。但是,如果该属性不存在(这里总是如此),那么只需定义该属性,而不是添加到它:=+=+=$p_row->total = gs_get_procuct_qty_price(....);
0赞 Code Lover 12/29/2020
@MagnusEriksson 必须由 和 计算。是 中的属性,我必须使用产品 ID 动态获取它。因此,我可以获取数组项(记录)的总数。请看一下修改后的问题。这是正确的方法吗?totalqtypriceqty$p_rowprice
0赞 M. Eriksson 12/29/2020
相反,我写了一个答案。

答:

0赞 Ali Fakoor 12/29/2020 #1

我认为在foreach循环中你不能添加索引,你必须在循环之前创建索引。@ 只是忽略通知。 最后,在您的代码中,“=”是额外的。

评论

0赞 Code Lover 12/29/2020
是的,我明白这一点,但是如何在循环之前定义属性?因为它仅在循环中可用。我错误地删除了多余的内容。$p_row=
0赞 Code Lover 12/29/2020
啊!以这种方式也是如此,这很有效。 这是正确的方法吗?foreach ($this->products as $p_row) { $p_row->total = 0; .. }
1赞 Ali Fakoor 12/29/2020
@CodeLover是的,我认为这是因为运算符“+=”必须有一个初始值来做功。
0赞 Code Lover 12/29/2020
明白了。谢谢:)明白了原因。
0赞 Hammad Ahmed khan 12/29/2020 #2

由于 $this->data[$p_row->group_id]['total'] 因此,它不是首先定义的 而您正在$this->data[$p_row->group_id]['total']+= 添加值 它抛出错误。您可以使用以下命令:

if(isset($this->data[$p_row->group_id]['total'])){
$this->data[$p_row->group_id]['total']+=gs_get_product_qty_price($p_row->product, $p_row->qty);
}else{
$this->data[$p_row->group_id]['total']= gs_get_product_qty_price($p_row->product, $p_row->qty);
}

评论

0赞 Code Lover 12/29/2020
谢谢。。请看一下我修改后的问题,这可行,但不确定是否是方法。Is it the solution?
1赞 Hammad Ahmed khan 12/29/2020
是的,它看起来不错
0赞 M. Eriksson 12/29/2020 #3

由于尚不存在,因此请定义它,而不是尝试添加它。只需更改为 .$p_row->total+==

foreach ($this->products as $p_row) {
    $this->data[ $p_row->group_id ][] = $p_row;
    $p_row->total = gs_get_product_qty_price($p_row->product, $p_row->qty);
}

当你使用 时,PHP 将首先读取属性的初始值并添加到该值。但是,由于该属性不存在,它会尝试从未定义的属性中读取,这将引发您看到的警告。更改为定义和设置值。+==