array('b','c'), 'd' => 'e') * * @param string $input * * @return array */ public static function parseParameters($input) { if (!is_string($input)) { return []; } $pairs = explode('&', $input); $parameters = []; foreach ($pairs as $pair) { $split = explode('=', $pair, 2); $parameter = Util::urldecodeRfc3986($split[0]); $value = isset($split[1]) ? Util::urldecodeRfc3986($split[1]) : ''; if (isset($parameters[$parameter])) { // We have already recieved parameter(s) with this name, so add to the list // of parameters with this name if (is_scalar($parameters[$parameter])) { // This is the first duplicate, so transform scalar (string) into an array // so we can add the duplicates $parameters[$parameter] = [$parameters[$parameter]]; } $parameters[$parameter][] = $value; } else { $parameters[$parameter] = $value; } } return $parameters; } /** * @param array $params * * @return string */ public static function buildHttpQuery(array $params) { if (empty($params)) { return ''; } // Urlencode both keys and values $keys = Util::urlencodeRfc3986(array_keys($params)); $values = Util::urlencodeRfc3986(array_values($params)); $params = array_combine($keys, $values); // Parameters are sorted by name, using lexicographical byte value ordering. // Ref: Spec: 9.1.1 (1) uksort($params, 'strcmp'); $pairs = []; foreach ($params as $parameter => $value) { if (is_array($value)) { // If two or more parameters share the same name, they are sorted by their value // Ref: Spec: 9.1.1 (1) // June 12th, 2010 - changed to sort because of issue 164 by hidetaka sort($value, SORT_STRING); foreach ($value as $duplicateValue) { $pairs[] = $parameter . '=' . $duplicateValue; } } else { $pairs[] = $parameter . '=' . $value; } } // For each parameter, the name is separated from the corresponding value by an '=' character (ASCII code 61) // Each name-value pair is separated by an '&' character (ASCII code 38) return implode('&', $pairs); } }