Chris@13: [ ... rows of field data ... ], Chris@13: * 'metadata1' => '...', Chris@13: * 'metadata2' => '...', Chris@13: * ] Chris@13: * Chris@13: * Example 2: nested metadata Chris@13: * Chris@13: * [ Chris@13: * 'metadata' => [ ... metadata items ... ], Chris@13: * 'rowid1' => [ ... ], Chris@13: * 'rowid2' => [ ... ], Chris@13: * ] Chris@13: * Chris@13: * It is, of course, also possible that both the data and Chris@13: * the metadata may be nested inside subelements. Chris@13: */ Chris@13: trait MetadataHolderTrait Chris@13: { Chris@13: protected $dataKey = false; Chris@13: protected $metadataKey = false; Chris@13: Chris@13: public function getDataKey() Chris@13: { Chris@13: return $this->dataKey; Chris@13: } Chris@13: Chris@13: public function setDataKey($key) Chris@13: { Chris@13: $this->dataKey = $key; Chris@13: return $this; Chris@13: } Chris@13: Chris@13: public function getMetadataKey() Chris@13: { Chris@13: return $this->metadataKey; Chris@13: } Chris@13: Chris@13: public function setMetadataKey($key) Chris@13: { Chris@13: $this->metadataKey = $key; Chris@13: return $this; Chris@13: } Chris@13: Chris@13: public function extractData($data) Chris@13: { Chris@13: if ($this->metadataKey) { Chris@13: unset($data[$this->metadataKey]); Chris@13: } Chris@13: if ($this->dataKey) { Chris@13: if (!isset($data[$this->dataKey])) { Chris@13: return []; Chris@13: } Chris@13: return $data[$this->dataKey]; Chris@13: } Chris@13: return $data; Chris@13: } Chris@13: Chris@13: public function extractMetadata($data) Chris@13: { Chris@13: if (!$this->dataKey && !$this->metadataKey) { Chris@13: return []; Chris@13: } Chris@13: if ($this->dataKey) { Chris@13: unset($data[$this->dataKey]); Chris@13: } Chris@13: if ($this->metadataKey) { Chris@13: if (!isset($data[$this->metadataKey])) { Chris@13: return []; Chris@13: } Chris@13: return $data[$this->metadataKey]; Chris@13: } Chris@13: return $data; Chris@13: } Chris@13: Chris@13: public function reconstruct($data, $metadata) Chris@13: { Chris@13: $reconstructedData = ($this->dataKey) ? [$this->dataKey => $data] : $data; Chris@13: $reconstructedMetadata = ($this->metadataKey) ? [$this->metadataKey => $metadata] : $metadata; Chris@13: Chris@13: return $reconstructedData + $reconstructedMetadata; Chris@13: } Chris@13: }