Skip to content

Instantly share code, notes, and snippets.

@yeroon
Created July 25, 2012 19:48
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yeroon/3178175 to your computer and use it in GitHub Desktop.
Save yeroon/3178175 to your computer and use it in GitHub Desktop.
PHP 5.3 Http QueryString Builder
<?php
namespace Yeroon;
/**
* Build querystring
*
* Build a querystring with add/remove features. Has array support to support adding and removing of params using square
* brackets (?foo[]=bar).
*
* Example:
* <code>
* // http://someurl.com/?a=1&b2
* $hqb = new HttpQueryBuilder($_GET);
* $hqb->add('c', '3'); // a=1&b=2&c3
* $hqb->remove('b'); // a=1&c=3
* $hqb->add(array('d' => array('4','5','6')); // a=1&c=3&d[0]=4&d[1]=5&d[2]=6
* $hqb->remove(array('d' => array('4','6'))); // a=1&c=3&d[0]=5
* </code>
*
* @author Jeroen Schouten <jgjschouten@gmail.com>
* @link http://www.github.com/yeroon
*/
class HttpQueryBuilder
{
/**
* @var array|null
*/
protected $_params;
/**
* @var string
*/
protected $_numericPrefix;
/**
* @var string
*/
protected $_argSeparator = '&';
/**
* Build querystring
*
* Build a querystring with add/remove features. Has array support to support adding and removing of params using
* square brackets (?foo[]=bar).
*
* Example:
* <code>
* // http://someurl.com/?a=1&b2
* $hqb = new HttpQueryBuilder($_GET);
* $hqb->add('c', '3'); // a=1&b=2&c3
* $hqb->remove('b'); // a=1&c=3
* $hqb->add(array('d' => array('4','5','6')); // a=1&c=3&d[0]=4&d[1]=5&d[2]=6
* $hqb->remove(array('d' => array('4','6'))); // a=1&c=3&d[0]=5
* </code>
*
* @param array|null $params If null, the $_GET superglobal will be used
*/
public function __construct($params = null)
{
if($params === null){
$params = $_GET;
}
$this->setParams($params);
}
/**
* Key-value pair or an associative array
*
* @param string|array $key
* @param mixed|null $value
* @return HttpQueryBuilder
*/
public function add($key, $value = null)
{
if(is_array($key)){
$this->_params = \array_replace_recursive($this->_params, $key);
} else {
$this->_params[$key] = $value;
}
return $this;
}
/**
* Key or associative array to remove
*
* @param array|string $key
* @return HttpQueryBuilder
*/
public function remove($key)
{
if(is_array($key)){
$diff = \array_diff($this->_params[\key($key)], $key[\key($key)]);
$this->_params[\key($key)] = \array_values($diff);
} else {
unset($this->_params[$key]);
}
return $this;
}
/**
* @return string
*/
public function toString()
{
return $this->__toString();
}
/**
* @return string
*/
public function __toString()
{
return \http_build_query($this->_params, $this->_numericPrefix, $this->_argSeparator);
}
/**
* The argument separator. Default is '&'
*
* @param string $argSeparator
* @return HttpQueryBuilder
*/
public function setArgSeparator($argSeparator)
{
$this->_argSeparator = $argSeparator;
return $this;
}
/**
* @return string
*/
public function getArgSeparator()
{
return $this->_argSeparator;
}
/**
* The prefix for all params. Default is null
*
* @param string $numericPrefix
* @return HttpQueryBuilder
*/
public function setNumericPrefix($numericPrefix)
{
$this->_numericPrefix = $numericPrefix;
return $this;
}
/**
* @return string|null
*/
public function getNumericPrefix()
{
return $this->_numericPrefix;
}
/**
* @param $params
* @return HttpQueryBuilder
*/
public function setParams($params)
{
$this->_params = $params;
return $this;
}
/**
* @return array|null
*/
public function getParams()
{
return $this->_params;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment