Skip to content

Commit

Permalink
Fix issue with non-sequential array keys.
Browse files Browse the repository at this point in the history
Xml::fromArray() should not cause errors with non-sequential
numeric array keys.

Fixes #2580
  • Loading branch information
markstory committed May 4, 2012
1 parent 128c719 commit 73b0345
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 1 deletion.
37 changes: 37 additions & 0 deletions lib/Cake/Test/Case/Utility/XmlTest.php
Expand Up @@ -322,6 +322,43 @@ public function testFromArray() {
$this->assertEquals(str_replace(array("\r", "\n"), '', $obj->asXML()), $xmlText);
}

/**
* Test non-sequential keys in list types.
*
* @return void
*/
public function testFromArrayNonSequentialKeys() {
$xmlArray = array(
'Event' => array(
array(
'id' => '235',
'Attribute' => array(
0 => array(
'id' => '9646',
),
2 => array(
'id' => '9647',
)
)
)
)
);
$obj = Xml::fromArray($xmlArray);
$expected = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<Event>
<id>235</id>
<Attribute>
<id>9646</id>
</Attribute>
<Attribute>
<id>9647</id>
</Attribute>
</Event>
XML;
$this->assertXmlStringEqualsXmlString($expected, $obj->asXML());
}

/**
* data provider for fromArray() failures
*
Expand Down
2 changes: 1 addition & 1 deletion lib/Cake/Utility/Xml.php
Expand Up @@ -230,7 +230,7 @@ protected static function _fromArray($dom, $node, &$data, $format) {
if ($key[0] === '@') {
throw new XmlException(__d('cake_dev', 'Invalid array'));
}
if (array_keys($value) === range(0, count($value) - 1)) { // List
if (is_numeric(implode(array_keys($value), ''))) { // List

This comment has been minimized.

Copy link
@dereuromark

dereuromark May 4, 2012

Member

isnt the first argument the glue and the second the array for implode()?

This comment has been minimized.

Copy link
@markstory

markstory May 4, 2012

Author Member

It should but the fun thing about implode() is it doesn't care which order its arguments come in.

This comment has been minimized.

Copy link
@markstory

markstory May 4, 2012

Author Member

Fixed in [ed1a64c]

foreach ($value as $item) {
$itemData = compact('dom', 'node', 'key', 'format');
$itemData['value'] = $item;
Expand Down

0 comments on commit 73b0345

Please sign in to comment.