filters = $filters; } public function __toString() { return $this->build(); } /** * Build XML for a set of filters. * * @return string */ private function build() { $prefix = ""; $suffix = ''; $xml = collect($this->filters)->map(function ($items) { return $this->buildEntry($items); })->implode(PHP_EOL); return collect([$prefix, $xml, $suffix])->implode(PHP_EOL); } /** * Build XML for an filter. * * @param Filter $filter * * @return string */ private function buildEntry(Filter $filter) { $entry = collect($filter->getProperties())->map(function ($value, $key) { return $this->buildProperty($value, $key); })->implode(''); return "{$entry}"; } /** * Build XML for a property. * * @param string $value * @param string $key * * @return string */ private function buildProperty($value, $key) { if (collect(['from', 'to'])->contains($key)) { $value = $this->implode($value); } return vsprintf("", [ $key, htmlentities($this->implode($value)), ]); } /** * Implode values with the appropriate prefix, suffix and separator. */ private function implode($value, $separator = '|') { if (is_string($value)) { return $value; } if (is_array($value) && count($value) === 1) { return reset($value); } return sprintf('(%s)', collect($value)->implode($separator)); } }