.../Value/RelationshipNormalizerValue.php | 59 +++++++++++++--------- 1 file changed, 35 insertions(+), 24 deletions(-) diff --git a/src/Normalizer/Value/RelationshipNormalizerValue.php b/src/Normalizer/Value/RelationshipNormalizerValue.php index 2cad6e9..e260de3 100644 --- a/src/Normalizer/Value/RelationshipNormalizerValue.php +++ b/src/Normalizer/Value/RelationshipNormalizerValue.php @@ -102,36 +102,47 @@ class RelationshipNormalizerValue extends FieldNormalizerValue { return $resource_identifier_objects; } - $unique_resource_identifier_objects = array_reduce($resource_identifier_objects, function ($carry, $resource_identifier_object) { + $resource_identifier_arity = static::computeResourceLinkageArity($resource_identifier_objects); + + $assigned_arities = []; + foreach ($resource_identifier_objects as $index => $resource_identifier_object) { $id = $resource_identifier_object['id']; - $has_meta = isset($resource_identifier_object['meta']); - if (!isset($carry[$id])) { - $carry[$id] = $resource_identifier_object; - if ($has_meta) { - // All resource identifier objects' metas need to be nested. - unset($carry[$id]['meta']); - } + // If arity === 1, don't set [meta][arity]. + if ($resource_identifier_arity[$id] === 1) { + continue; } - else { - // Increment arity. - if (!isset($carry[$id]['meta']['arity'])) { - $carry[$id]['meta']['arity'] = 1; - } - $carry[$id]['meta']['arity']++; - - // Nest all resource identifier objects' metas under a shared key. - if ($has_meta) { - if (!isset($carry[$id]['meta']['metas'])) { - $carry[$id]['meta']['metas'] = []; - } - $carry[$id]['meta']['metas'][] = $resource_identifier_object['meta']; - } + + // Determine arity of current resource identifier and assign it. + $arity = isset($assigned_arities[$id]) + ? ++$assigned_arities[$id] + : 0; + $resource_identifier_objects[$index]['meta']['arity'] = $arity; + + // Track assigned arities. + $assigned_arities[$id] = $arity; + } + + return $resource_identifier_objects; + } + + /** + * Computes the arity of each resource link. + * + * @param array $resource_identifier_objects + * A list of JSON API resource identifier objects. + * @return array + * Resource identifiers as keys, arities as values. + */ + protected static function computeResourceLinkageArity(array $resource_identifier_objects) { + return array_reduce($resource_identifier_objects, function ($carry, $resource_identifier_object) { + $id = $resource_identifier_object['id']; + if (!isset($carry[$id])) { + $carry[$id] = 0; } + $carry[$id]++; return $carry; }, []); - - return array_values($unique_resource_identifier_objects); } /**