/** * processes SimpleXMLIterator objects recursively * * @access protected * @param object $iterator * @return array xml converted to array */ private static function _iteratorToArray($iterator) { $xmlArray = array(); $value = null; // rewind the iterator and check if the position is valid // if not, return the string it contains $iterator->rewind(); if (!$iterator->valid()) { return self::_typecastXmlValue($iterator); } for ($iterator->rewind(); $iterator->valid(); $iterator->next()) { $tmpArray = null; $value = null; // get the attribute type string for use in conditions below $attributeType = $iterator->attributes()->type; // extract the parent element via xpath query $parentElement = $iterator->xpath($iterator->key() . '/..'); if ($parentElement[0] instanceof SimpleXMLIterator) { $parentElement = $parentElement[0]; $parentKey = Braintree_Util::delimiterToCamelCase($parentElement->getName()); } else { $parentElement = null; } if ($parentKey == "customFields") { $key = Braintree_Util::delimiterToUnderscore($iterator->key()); } else { $key = Braintree_Util::delimiterToCamelCase($iterator->key()); } // process children recursively if ($iterator->hasChildren()) { // return the child elements $value = self::_iteratorToArray($iterator->current()); // if the element is an array type, // use numeric keys to allow multiple values if ($attributeType != 'array') { $tmpArray[$key] = $value; } } else { // cast values according to attributes $tmpArray[$key] = self::_typecastXmlValue($iterator->current()); } // set the output string $output = isset($value) ? $value : $tmpArray[$key]; // determine if there are multiple tags of this name at the same level if (isset($parentElement) && $parentElement->attributes()->type == 'collection' && $iterator->hasChildren()) { $xmlArray[$key][] = $output; continue; } // if the element was an array type, output to a numbered key // otherwise, use the element name if ($attributeType == 'array') { $xmlArray[] = $output; } else { $xmlArray[$key] = $output; } } return $xmlArray; }
function testDelimeterToUnderscore() { $this->assertEquals("a_b_c", Braintree_Util::delimiterToUnderscore("a-b-c")); }