/**
* @param array $map
* @param string $prefix
*/
public function init(array $map = array(), $prefix = '')
{
if (empty($map)) {
return;
}
$map = PPUtils::lowerKeys($map);
foreach (get_object_vars($this) as $property => $defaultValue) {
if (array_key_exists($propKey = strtolower($prefix . $property), $map) && $this->isBuiltInType($type = PPUtils::propertyType($this, $property))) {
$type = PPUtils::propertyType($this, $property);
$this->{$property} = urldecode($map[$propKey]);
continue;
// string
} elseif (!($filtered = PPUtils::filterKeyPrefix($map, $propKey))) {
continue;
// NULL
}
if (!class_exists($type = PPUtils::propertyType($this, $property)) && !$this->isBuiltInType($type)) {
trigger_error("Class {$type} not found.", E_USER_NOTICE);
continue;
// just ignore
}
if (is_array($defaultValue) || PPUtils::isPropertyArray($this, $property)) {
// array of objects
if ($this->isBuiltInType($type)) {
// Array of simple types
foreach ($filtered as $key => $value) {
$this->{$property}[trim($key, "()")] = urldecode($value);
}
} else {
// Array of complex objects
$delim = '.';
for ($i = 0; $itemValues = PPUtils::filterKeyPrefix($filtered, "({$i})"); $i++) {
$this->{$property}[$i] = $item = new $type();
$item->init(PPUtils::filterKeyPrefix($itemValues, "."));
if (array_key_exists("", $itemValues)) {
$item->value = urldecode($itemValues[""]);
}
}
// Handle cases where we have a list of objects
// with just the value present and all attributes values are null
foreach ($filtered as $key => $value) {
$idx = trim($key, "()");
if (is_numeric($idx) && (is_null($this->{$property}) || !array_key_exists($idx, $this->{$property}))) {
$this->{$property}[$idx] = new $type();
$this->{$property}[$idx]->value = urldecode($value);
}
}
}
} else {
// one object
$this->{$property} = new $type();
$this->{$property}->init(PPUtils::filterKeyPrefix($filtered, '.'));
// unprefix
if (array_key_exists("", $filtered)) {
$this->{$property}->value = urldecode($filtered[""]);
}
}
}
}