PHP函数:如果设置了对象值,则返回它

时间:2016-12-07 22:02:43

标签: php

我正在尝试输出on对象的值,但某些对象记录可能不存在该值。如何在不引发错误“Undefined property:stdClass”的情况下返回值?

例如,我有一个对象:

$obj = '[{"id":111,"value1":1,"value2":2},{"id":111,"value1":1}]';
对于数组中的第二个元素,

value2不存在,我想编写一个函数来处理数组中的每个对象。例如:

function add($obj){
   $sum = 0;
   foreach($obj as $o){
      $sum += $o->value1;          

       if(isset($o->value2)){
          $sum += $o->value2;
       }
   }
   return $sum;
}

if部分是我想要改进的部分。某些对象可能存在许多其他值。我不想每次都写if(isset($o->valueN))

是否还有其他更简单的方法来对此进行编码以避免未定义的属性错误?

2 个答案:

答案 0 :(得分:2)

选项1:在php7中,您可以使用Null Coalescing Operator,

$sum += $o->value2 ?? 0;

选项2:如果您可以为子项创建特定的类,那么您可以使用magic方法__get(),这样您只需要编写isset一次。

选项3:接受它?我的代码充斥着isset(),因为它提醒您可能会设置或不设置某些内容,但您知道它并正在处理它。

答案 1 :(得分:1)

这将确保您只添加所需的出现,并且只有它们存在于数组中。

ini_set('display_errors', 1); ini_set('log_errors',1); 

$obj = '[{"id":111,"value1":1,"value2":2},{"id":111,"value1":1}]';
$obj_array = json_decode($obj);

$required_occ = ['value1', 'value2'];

$sum = 0;

foreach ( $obj_array as $obj ) {
    foreach ( $required_occ as $occ ) {
        if ( isset($obj->$occ) ) {
            $sum += $obj->$occ;
        }
    }
}

echo $sum;

结果

4

或者减少一点,如果您使用PHP7并使用Null Coalescing Operator

ini_set('display_errors', 1); ini_set('log_errors',1); 

$obj = '[{"id":111,"value1":1,"value2":2},{"id":111,"value1":1}]';
$obj_array = json_decode($obj);

$required_occ = ['value1', 'value2'];
$sum = 0;
foreach ( $obj_array as $obj ) {
    foreach ( $required_occ as $occ ) {
        $sum += $obj->{$occ} ?? 0;
    }
}

echo $sum;

结果

4