diff --git a/README.md b/README.md index ec6a6ad..954bc25 100755 --- a/README.md +++ b/README.md @@ -239,6 +239,58 @@ This will result in: ``` +### Using Closure values +The package can use Closure values: + +```php +$users = [ + [ + 'name' => 'one', + 'age' => 10, + ], + [ + 'name' => 'two', + 'age' => 12, + ], +]; + +$array = [ + 'users' => function () use ($users) { + $new_users = []; + foreach ($users as $user) { + $new_users[] = array_merge( + $user, + [ + 'double_age' => $user['age'] * 2, + ] + ); + } + + return $new_users; + }, +]; + +ArrayToXml::convert($array) +``` + +This will result in: + +```xml + + + + one + 10 + 20 + + + two + 12 + 24 + + +``` + ### Handling numeric keys The package can also can handle numeric keys: diff --git a/src/ArrayToXml.php b/src/ArrayToXml.php index b84bdc8..eac1ec2 100644 --- a/src/ArrayToXml.php +++ b/src/ArrayToXml.php @@ -2,6 +2,7 @@ namespace Spatie\ArrayToXml; +use Closure; use DOMDocument; use DOMElement; use DOMException; @@ -143,6 +144,10 @@ public function addProcessingInstruction(string $target, string $data): self protected function convertElement(DOMElement $element, mixed $value): void { + if ($value instanceof Closure) { + $value = $value(); + } + $sequential = $this->isArrayAllKeySequential($value); if (! is_array($value)) { diff --git a/tests/ArrayToXmlTest.php b/tests/ArrayToXmlTest.php index d9b91b4..74f80da 100644 --- a/tests/ArrayToXmlTest.php +++ b/tests/ArrayToXmlTest.php @@ -290,6 +290,35 @@ ])); }); +it('can handle closure values', function () { + $users = [ + [ + 'name' => 'one', + 'age' => 10, + ], + [ + 'name' => 'two', + 'age' => 12, + ], + ]; + + assertMatchesXmlSnapshot(ArrayToXml::convert([ + 'users' => function () use ($users) { + $new_users = []; + foreach ($users as $user) { + $new_users[] = array_merge( + $user, + [ + 'double_age' => $user['age'] * 2, + ] + ); + } + + return $new_users; + }, + ])); +}); + test('and mixed values can also be set in SimpleXMLElement style', function () { assertMatchesSnapshot(ArrayToXml::convert([ 'movie' => [ diff --git a/tests/__snapshots__/ArrayToXmlTest__it_can_handle_closure_values__1.xml b/tests/__snapshots__/ArrayToXmlTest__it_can_handle_closure_values__1.xml new file mode 100644 index 0000000..73dfba3 --- /dev/null +++ b/tests/__snapshots__/ArrayToXmlTest__it_can_handle_closure_values__1.xml @@ -0,0 +1,13 @@ + + + + one + 10 + 20 + + + two + 12 + 24 + +