$mappers) { $this->mappers[$type] = []; foreach ($mappers as $mapper) { $this->mappers[$type][] = $mapper; } } } /** * @param array $indexData [attribute_id(int) => attribute_value(string|int|string[]|int[])] * @param int $storeId * @param array $context * @return array */ public function mapEntityData(array $indexData, $storeId, $context = []) { $data = []; $indexerId = $context[self::INDEXER_ID] ?? self::DEFAULT_DATA_INDEXER; if (isset($this->mappers[$indexerId]) && is_array($this->mappers[$indexerId])) { /** @var DataMapperInterface $mapper */ foreach ($this->mappers[$indexerId] as $mapper) { $context[self::MAPPED_DATA_KEY] = $data; $mappedData = $mapper->map($indexData, $storeId, $context); $data = $this->mergeData($mappedData, $data); } } return $data; } private function mergeData(array $mappedData, array $data): array { /** @var array $entityData */ foreach ($mappedData as $entityId => $entityData) { if (isset($data[$entityId])) { $data[$entityId] = $entityData + $data[$entityId]; } else { $data[$entityId] = $entityData; } } return $data; } }