/**
  * Construct XML elements with attributes from an associative array.
  *
  * @access protected
  * @static
  * @param object $writer XMLWriter object
  * @param array $aData contains attributes and values
  * @return none
  */
 private static function _createElementsFromArray(&$writer, $aData)
 {
     if (!is_array($aData)) {
         $writer->text($aData);
         return;
     }
     foreach ($aData as $index => $element) {
         // convert the style back to gateway format
         $elementName = Braintree_Util::camelCaseToDelimiter($index, '-');
         // handle child elements
         $writer->startElement($elementName);
         if (is_array($element)) {
             if (array_key_exists(0, $element) || empty($element)) {
                 $writer->writeAttribute('type', 'array');
                 foreach ($element as $ignored => $itemInArray) {
                     $writer->startElement('item');
                     self::_createElementsFromArray($writer, $itemInArray);
                     $writer->endElement();
                 }
             } else {
                 self::_createElementsFromArray($writer, $element);
             }
         } else {
             // generate attributes as needed
             $attribute = self::_generateXmlAttribute($element);
             if (is_array($attribute)) {
                 $writer->writeAttribute($attribute[0], $attribute[1]);
                 $element = $attribute[2];
             }
             $writer->text($element);
         }
         $writer->endElement();
     }
 }
 private function _underscoreKeys($array)
 {
     foreach ($array as $key => $value) {
         $newKey = Braintree_Util::camelCaseToDelimiter($key, '_');
         unset($array[$key]);
         if (is_array($value)) {
             $array[$newKey] = $this->_underscoreKeys($value);
         } else {
             $array[$newKey] = $value;
         }
     }
     return $array;
 }