Skip to content
Permalink
Browse files

Fix issue with non-sequential array keys.

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 73b0345ff4c2fc55339a19b204131daf27069b2e
Showing with 38 additions and 1 deletion.
  1. +37 −0 lib/Cake/Test/Case/Utility/XmlTest.php
  2. +1 −1 lib/Cake/Utility/Xml.php
@@ -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
*
@@ -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.

@dereuromark

dereuromark May 4, 2012

Member

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

This comment has been minimized.

@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.

@markstory

markstory May 4, 2012

Author Member

Fixed in [ed1a64c]

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

0 comments on commit 73b0345

Please sign in to comment.
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.