private function UriTemplate::expandMatch

Process an expansion

Parameters

array $matches Matches met in the preg_replace_callback:

Return value

string Returns the replacement string

File

drupal/core/vendor/guzzle/parser/Guzzle/Parser/UriTemplate/UriTemplate.php, line 114

Class

UriTemplate
Expands URI templates using an array of variables

Namespace

Guzzle\Parser\UriTemplate

Code

private function expandMatch(array $matches) {
  static $rfc1738to3986 = array(
    '+' => '%20',
    '%7e' => '~',
  );
  $parsed = self::parseExpression($matches[1]);
  $replacements = array();
  $prefix = $parsed['operator'];
  $joiner = $parsed['operator'];
  $useQueryString = false;
  if ($parsed['operator'] == '?') {
    $joiner = '&';
    $useQueryString = true;
  }
  elseif ($parsed['operator'] == '&') {
    $useQueryString = true;
  }
  elseif ($parsed['operator'] == '#') {
    $joiner = ',';
  }
  elseif ($parsed['operator'] == ';') {
    $useQueryString = true;
  }
  elseif ($parsed['operator'] == '' || $parsed['operator'] == '+') {
    $joiner = ',';
    $prefix = '';
  }
  foreach ($parsed['values'] as $value) {
    if (!array_key_exists($value['value'], $this->variables) || $this->variables[$value['value']] === null) {
      continue;
    }
    $variable = $this->variables[$value['value']];
    $actuallyUseQueryString = $useQueryString;
    $expanded = '';
    if (is_array($variable)) {
      $isAssoc = $this
        ->isAssoc($variable);
      $kvp = array();
      foreach ($variable as $key => $var) {
        if ($isAssoc) {
          $key = rawurlencode($key);
          $isNestedArray = is_array($var);
        }
        else {
          $isNestedArray = false;
        }
        if (!$isNestedArray) {
          $var = rawurlencode($var);
          if ($parsed['operator'] == '+' || $parsed['operator'] == '#') {
            $var = $this
              ->decodeReserved($var);
          }
        }
        if ($value['modifier'] == '*') {
          if ($isAssoc) {
            if ($isNestedArray) {

              // Nested arrays must allow for deeply nested structures
              $var = strtr(http_build_query(array(
                $key => $var,
              )), $rfc1738to3986);
            }
            else {
              $var = $key . '=' . $var;
            }
          }
          elseif ($key > 0 && $actuallyUseQueryString) {
            $var = $value['value'] . '=' . $var;
          }
        }
        $kvp[$key] = $var;
      }
      if (empty($variable)) {
        $actuallyUseQueryString = false;
      }
      elseif ($value['modifier'] == '*') {
        $expanded = implode($joiner, $kvp);
        if ($isAssoc) {

          // Don't prepend the value name when using the explode modifier with an associative array
          $actuallyUseQueryString = false;
        }
      }
      else {
        if ($isAssoc) {

          // When an associative array is encountered and the explode modifier is not set, then the
          // result must be a comma separated list of keys followed by their respective values.
          foreach ($kvp as $k => &$v) {
            $v = $k . ',' . $v;
          }
        }
        $expanded = implode(',', $kvp);
      }
    }
    else {
      if ($value['modifier'] == ':') {
        $variable = substr($variable, 0, $value['position']);
      }
      $expanded = rawurlencode($variable);
      if ($parsed['operator'] == '+' || $parsed['operator'] == '#') {
        $expanded = $this
          ->decodeReserved($expanded);
      }
    }
    if ($actuallyUseQueryString) {
      if (!$expanded && $joiner != '&') {
        $expanded = $value['value'];
      }
      else {
        $expanded = $value['value'] . '=' . $expanded;
      }
    }
    $replacements[] = $expanded;
  }
  $ret = implode($joiner, $replacements);
  if ($ret && $prefix) {
    return $prefix . $ret;
  }
  return $ret;
}