php - Handling !isset values without checking isset -


i have object pulled api similar structure:

class stdclass#544 (5) {   public $id =>   string(1) "4"   public $name =>   class stdclass#545 (6) {     public $en =>     string(6) "test"   }   public $description =>   class stdclass#546 (6) {     public $en =>     string(20) "my description."   } } 

however, api inconsistent. sometimes, objects have no description attributes:

class stdclass#544 (5) {   public $id =>   string(1) "7"   public $name =>   class stdclass#545 (6) {     public $en =>     string(6) "another test"   } } 

as i'm looping through api, i'm mapping values objects array:

$values = array(); foreach( $objects $object ) {   $values = array(     'id' => $object->id,     'name' => $object->name->en,     'description' => $object->description->en,   );   somefunction($values); } 

however, since description not set/existing attribute of object, throws exception if description missing.

what best approach handle mapping of attributes not there? can check existence of every single attribute before assigning them:

$values = array(); if ( isset($object->id) )   $values['id'] = $object->id;  if ( isset($object->name) , isset($object->name->en) )   $values['id'] = $object->name->en;  if ( isset($object->description) , isset($object->description->en) )   $values['description'] = $object->description->en; 

but approach becomes cumbersome , more difficult maintain, when there more attributes listed. above example simplified version of problem. in reality there many more attributes. manually checking existence of attributes becomes more of pain, , more when nested attributes.

one simple solution i've found use @ symbol, forces php ignore exceptions:

$values = array(); foreach( $objects $object ) {   @$values = array(     'id' => $object->id,     'name' => $object->name->en,     'description' => $object->description->en,   );   somefunction($values); } 

this results in description being null (which ideal me). no exception thrown. i'm pretty sure @ used debugging purposes , don't think it's proper use in way.

what best approach handling this? can somehow set values in array null if attribute/key doesn't exist in object without having manually check existence of every single attribute?

you define keys want extract object in array , extract each key in foreach loop.

edit

just noticed accessing objects within objects. if need go 1 level deep example below should it.

if value you're extracting property of object additional level deep, make corresponding key array of keyname => subkeyname.

$a = new stdclass(); $a->id = 'hello'; $a->description = 'world'; $a->name = new stdclass(); $a->name->en = 'name';  $keys = ['id','description','notset',['name' => 'en']]; $value = []; foreach($keys $key) {      if(is_array($key)) {         $subkey = current($key);         $key = key($key);         $value[$key] = (isset($a->$key->$subkey))           ? $a->$key->$subkey : null;     }     else {         $value[$key] = (isset($a->$key))            ? $a->$key : null;     } }  var_dump($value); 

Comments

Popular posts from this blog

javascript - RequestAnimationFrame not working when exiting fullscreen switching space on Safari -

Python ctypes access violation with const pointer arguments -