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
+
+