Skip to content

Commit

Permalink
Added Closure value support (#219)
Browse files Browse the repository at this point in the history
* Added Closure value support

* Added Closure example to docs

* Changed use Closure
  • Loading branch information
SuperDJ authored Jul 19, 2023
1 parent 6361299 commit f9ab39c
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 0 deletions.
52 changes: 52 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,58 @@ This will result in:
</helloyouluckypeople>
```

### 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
<?xml version="1.0"?>
<root>
<users>
<name>one</name>
<age>10</age>
<double_age>20</double_age>
</users>
<users>
<name>two</name>
<age>12</age>
<double_age>24</double_age>
</users>
</root>
```

### Handling numeric keys

The package can also can handle numeric keys:
Expand Down
5 changes: 5 additions & 0 deletions src/ArrayToXml.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Spatie\ArrayToXml;

use Closure;
use DOMDocument;
use DOMElement;
use DOMException;
Expand Down Expand Up @@ -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)) {
Expand Down
29 changes: 29 additions & 0 deletions tests/ArrayToXmlTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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' => [
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?xml version="1.0"?>
<root>
<users>
<name>one</name>
<age>10</age>
<double_age>20</double_age>
</users>
<users>
<name>two</name>
<age>12</age>
<double_age>24</double_age>
</users>
</root>

0 comments on commit f9ab39c

Please sign in to comment.