public static function toArray($data, array $options = array())
{
$defaults = array('handlers' => array());
$options += $defaults;
$result = array();
foreach ($data as $key => $item) {
switch (true) {
case is_array($item):
$result[$key] = static::toArray($item, $options);
break;
case !is_object($item):
$result[$key] = $item;
break;
case isset($options['handlers'][$class = get_class($item)]):
$result[$key] = $options['handlers'][$class]($item);
break;
case method_exists($item, 'to'):
$result[$key] = $item->to('array', $options);
break;
case $vars = get_object_vars($item):
$result[$key] = static::toArray($vars, $options);
break;
case method_exists($item, '__toString'):
$result[$key] = (string) $item;
break;
default:
$result[$key] = $item;
break;
}
}
return $result;
}