public function fromArray($arr)
{
if (!empty($arr)) {
// Iterate over each element in array
foreach ($arr as $k => $v) {
// If the value is an array, it means, it is an object after conversion
if (is_array($v)) {
// Determine the class of the object
if (($clazz = ReflectionUtil::getPropertyClass(get_class($this), $k)) != null) {
// If the value is an associative array, it means, its an object. Just make recursive call to it.
if (empty($v)) {
if (ReflectionUtil::isPropertyClassArray(get_class($this), $k)) {
// It means, it is an array of objects.
$this->assignValue($k, array());
continue;
}
$o = new $clazz();
//$arr = array();
$this->assignValue($k, $o);
} elseif (ArrayUtil::isAssocArray($v)) {
/** @var self $o */
$o = new $clazz();
$o->fromArray($v);
$this->assignValue($k, $o);
} else {
// Else, value is an array of object/data
$arr = array();
// Iterate through each element in that array.
foreach ($v as $nk => $nv) {
if (is_array($nv)) {
$o = new $clazz();
$o->fromArray($nv);
$arr[$nk] = $o;
} else {
$arr[$nk] = $nv;
}
}
$this->assignValue($k, $arr);
}
} else {
$this->assignValue($k, $v);
}
} else {
$this->assignValue($k, $v);
}
}
}
return $this;
}