You are here

private static function Braintree_Xml_Parser::_iteratorToArray in Commerce Braintree 7

processes SimpleXMLIterator objects recursively

@access protected

Parameters

object $iterator:

Return value

array xml converted to array

1 call to Braintree_Xml_Parser::_iteratorToArray()
Braintree_Xml_Parser::arrayFromXml in braintree_php/lib/Braintree/Xml/Parser.php
sets up the SimpleXMLIterator and starts the parsing @access public

File

braintree_php/lib/Braintree/Xml/Parser.php, line 49

Class

Braintree_Xml_Parser
Parses incoming Xml into arrays using PHP's built-in SimpleXML, and its extension via Iterator, SimpleXMLIterator

Code

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;
}