public static function unwrap_complex_field_values($instance, $complex_field_names)
{
foreach ($complex_field_names as $name) {
foreach ($instance as $key => $value) {
if (!preg_match('~^' . preg_quote($name, '~') . '(?P<group>\\w*)-_?(?P<key>.*?)_(?P<index>\\d+)_?(?P<sub>\\w+)?(-(?P<trailing>.*))?$~', $key, $field_name)) {
continue;
}
$value = maybe_unserialize($value);
$instance[$name][$field_name['index']]['_type'] = $field_name['group'];
if (!empty($field_name['trailing'])) {
if (!preg_match('~^' . preg_quote($field_name['key'], '~') . '(?P<group>\\w*)-_?(?P<key>.*)_(?P<index>\\d+)_?(?P<sub>\\w+)?$~', $field_name['key'] . '_' . $field_name['sub'] . '-' . $field_name['trailing'], $subfield_name)) {
continue;
}
$instance[$name][$field_name['index']][$field_name['key']][$subfield_name['index']]['_type'] = $subfield_name['group'];
if (!empty($subfield_name['sub'])) {
$instance[$name][$field_name['index']][$field_name['key']][$subfield_name['index']][$subfield_name['key']][$subfield_name['sub']] = $value;
} else {
$instance[$name][$field_name['index']][$field_name['key']][$subfield_name['index']][$subfield_name['key']] = $value;
}
} else {
if (!empty($field_name['sub'])) {
$instance[$name][$field_name['index']][$field_name['key']][$field_name['sub']] = $value;
} else {
$instance[$name][$field_name['index']][$field_name['key']] = $value;
}
}
unset($instance[$key]);
}
}
return $instance;
}