protected function _toArray(DOMNodeList $nodes) {
		$array = array();
		foreach ($nodes as $node) {
			if ($node->nodeType != XML_ELEMENT_NODE) {
				continue;
			}
			if ($node->hasAttributes()) { // deep
				if ($node->tagName == 'error') {
					$array = array(
						'id' => $node->getAttribute('id'),
						'code' => $node->getAttribute('code'),
						'auxCode' => $node->getAttribute('auxCode'),
						'message' => $node->nodeValue
					);
				} else {
					// in the case of custom charges, use the id for the key
					if ($node->hasAttribute('code') && $node->getAttribute('code')) {
						$key = $node->getAttribute('code');

						$tmpArr = array();

						if ($node->hasAttribute('id')) {
							$tmpArr = array(
								'id' => $node->getAttribute('id')
							);
						}
						$tmpArr = $tmpArr + array('code'=>$key);

						// charges need to be a nested array since there can be multiple charges with the same charge code
						if ($node->tagName == 'charge') {
							$array[$key][] = $tmpArr;
						} else {
							$array[$key] = $tmpArr;
						}

						unset($tmpArr);

					} else {
						$key = $node->getAttribute('id');
						$array[$key] = array('id' => $node->getAttribute('id'));
					}
					$array[$key] = $array[$key] + $this->_toArray($node->childNodes);
				}
			} else {
				if ($node->tagName == 'errors') {
					$array[$node->tagName][] = $this->_toArray($node->childNodes);
				} else if ($node->childNodes->length > 1) { // sub array
					$array[$node->tagName] = $this->_toArray($node->childNodes);
				} else {
					$array[$node->tagName] = $node->nodeValue;
				}
			}
		}
		return $array;
	}
protected function _toArray(DOMNodeList $nodes) {
		$array = array();
		foreach ($nodes as $node) {
			if ($node->nodeType != XML_ELEMENT_NODE) {
				continue;
			}
			if ($node->hasAttributes()) { // deep
				if ($node->tagName == 'error') {
					$array = array(
						'id' => $node->getAttribute('id'),
						'code' => $node->getAttribute('code'),
						'auxCode' => $node->getAttribute('auxCode'),
						'message' => $node->nodeValue
					);
				} else {
					// in the case of custom charges, use the id for the key
					if ($node->hasAttribute('code') && $node->getAttribute('code')) {
						$key = $node->getAttribute('code');

						$tmpArr = array();

						if ($node->hasAttribute('id')) {
							$tmpArr = array(
								'id' => $node->getAttribute('id')
							);
						}
						$tmpArr = $tmpArr + array('code'=>$key);

						// charges need to be a nested array since there can be multiple charges with the same charge code
						if ($node->tagName == 'charge') {
							$array[$key][] = $tmpArr;
						} else {
							$array[$key] = $tmpArr;
						}

						unset($tmpArr);

					} else {
						$key = $node->getAttribute('id');
						$array[$key] = array('id' => $node->getAttribute('id'));
					}
					$array[$key] = $array[$key] + $this->_toArray($node->childNodes);
				}
			} else {
				if ($node->tagName == 'errors') {
					$array[$node->tagName][] = $this->_toArray($node->childNodes);
				} else if ($node->childNodes->length > 1) { // sub array
					$array[$node->tagName] = $this->_toArray($node->childNodes);
				} else {
					$array[$node->tagName] = $node->nodeValue;
				}
			}
		}
		return $array;
	}
protected function _toArray ( DOMNodeList $ nodes ) { $ array = array ( ) ; foreach ( $ nodes as $ node ) { if ( $ node -> nodeType != XML_ELEMENT_NODE ) { continue ; } if ( $ node -> hasAttributes ( ) ) { // deep if ( $ node -> tagName == 'error' ) { $ array = array ( 'id' => $ node -> getAttribute ( 'id' ) , 'code' => $ node -> getAttribute ( 'code' ) , 'auxCode' => $ node -> getAttribute ( 'auxCode' ) , 'message' => $ node -> nodeValue ) ; } else { // in the case of custom charges, use the id for the key if ( $ node -> hasAttribute ( 'code' ) && $ node -> getAttribute ( 'code' ) ) { $ key = $ node -> getAttribute ( 'code' ) ; $ tmpArr = array ( ) ; if ( $ node -> hasAttribute ( 'id' ) ) { $ tmpArr = array ( 'id' => $ node -> getAttribute ( 'id' ) ) ; } $ tmpArr = $ tmpArr + array ( 'code' => $ key ) ; // charges need to be a nested array since there can be multiple charges with the same charge code if ( $ node -> tagName == 'charge' ) { $ array [ $ key ] [ ] = $ tmpArr ; } else { $ array [ $ key ] = $ tmpArr ; } unset ( $ tmpArr ) ; } else { $ key = $ node -> getAttribute ( 'id' ) ; $ array [ $ key ] = array ( 'id' => $ node -> getAttribute ( 'id' ) ) ; } $ array [ $ key ] = $ array [ $ key ] + $ this -> _toArray ( $ node -> childNodes ) ; } } else { if ( $ node -> tagName == 'errors' ) { $ array [ $ node -> tagName ] [ ] = $ this -> _toArray ( $ node -> childNodes ) ; } else if ( $ node -> childNodes -> length > 1 ) { // sub array $ array [ $ node -> tagName ] = $ this -> _toArray ( $ node -> childNodes ) ; } else { $ array [ $ node -> tagName ] = $ node -> nodeValue ; } } } return $ array ; }
Recursive method to traverse the dom and produce an array

@param DOMNodeList $nodes
@return array
Recursive method to traverse the dom and produce an array