fork(1) download
  1. <?php
  2.  
  3. /**
  4.  * Like array_merge, but will recursively merge array values.
  5.  *
  6.  * @param array $a1
  7.  * The array to be merged into.
  8.  * @param array $a2
  9.  * The array to merge in. Overwrites $a1, when string keys conflict.
  10.  * Numeric keys will just be appended.
  11.  * @return array
  12.  * The array, post-merge.
  13.  */
  14. function merge_query_var_arrays($a1, $a2) {
  15. foreach ($a2 as $k2 => $v2)
  16. if (is_string($k2))
  17. $a1[$k2] = isset($a1[$k2]) && is_array($v2) ? merge_query_var_arrays($a1[$k2], $v2) : $v2;
  18. else
  19. $a1[] = $v2;
  20. return $a1;
  21. }
  22.  
  23. /**
  24.  * @param string $query_string
  25.  * The URL or query string to add to.
  26.  * @param string|array $vars_to_add
  27.  * Either a string in var=val&[...] format, or an array.
  28.  * @return string
  29.  * The new query string. Duplicate vars are overwritten.
  30.  */
  31. function add_query_vars($query_string, $vars_to_add) {
  32. if (is_string($vars_to_add))
  33. parse_str($vars_to_add, $vars_to_add);
  34. if (preg_match('/.*\?/', $query_string, $match))
  35. $query_string = preg_replace('/.*\?/', '', $query_string);
  36. parse_str($query_string, $query_vars);
  37.  
  38. $query_vars = merge_query_var_arrays($query_vars, $vars_to_add);
  39. return @$match[0] . http_build_query($query_vars);
  40. }
  41.  
  42. function assertEquals($a, $b) {
  43. if ($a === $b) {
  44. echo "Assertion passed for $a!\n";
  45. return true;
  46. }
  47. echo "Failed assertion; got: $a\n";
  48. echo " expected: $b\n";
  49. return false;
  50. }
  51.  
  52. header("Content-Type: text/plain");
  53. assertEquals(add_query_vars("", ""),
  54. "");
  55. assertEquals(add_query_vars("http://w...content-available-to-author-only...e.ca/search?q=abc&oq=ab", ""),
  56. "http://w...content-available-to-author-only...e.ca/search?q=abc&oq=ab");
  57. assertEquals(add_query_vars("?a=1&b=2", ""),
  58. "?a=1&b=2");
  59. assertEquals(add_query_vars("a&b=0", ""),
  60. "a=&b=0");
  61. assertEquals(add_query_vars("a[]=1&a[3]=2&a[]=3&b=4", ""),
  62. str_replace(array("[", "]"), array("%5B", "%5D"), "a[0]=1&a[3]=2&a[4]=3&b=4"));
  63.  
  64. assertEquals(add_query_vars("", "a=1&b=2"),
  65. "a=1&b=2");
  66. assertEquals(add_query_vars("http://w...content-available-to-author-only...e.ca/search?q=abc&oq=ab", "oq=cba&ie=UTF-8"),
  67. "http://w...content-available-to-author-only...e.ca/search?q=abc&oq=cba&ie=UTF-8");
  68. assertEquals(add_query_vars("?a=1&b=2", array('c'=>3,'a'=>-1)),
  69. "?a=-1&b=2&c=3");
  70. assertEquals(add_query_vars("a&b=0", "b"),
  71. "a=&b=");
  72. assertEquals(add_query_vars("a[]=1&a[3]=2&a[]=3&b=4&c[]=red&c[]=blue", array("a" => array(4), "d" => "yes", "c" => array("orange", "yellow"))),
  73. str_replace(array("[", "]"), array("%5B", "%5D"), "a[0]=1&a[3]=2&a[4]=3&a[5]=4&b=4&c[0]=red&c[1]=blue&c[2]=orange&c[3]=yellow&d=yes"));
  74.  
Success #stdin #stdout 0.01s 20568KB
stdin
Standard input is empty
stdout
Assertion passed for !
Assertion passed for http://w...content-available-to-author-only...e.ca/search?q=abc&oq=ab!
Assertion passed for ?a=1&b=2!
Assertion passed for a=&b=0!
Assertion passed for a%5B0%5D=1&a%5B3%5D=2&a%5B4%5D=3&b=4!
Assertion passed for a=1&b=2!
Assertion passed for http://w...content-available-to-author-only...e.ca/search?q=abc&oq=cba&ie=UTF-8!
Assertion passed for ?a=-1&b=2&c=3!
Assertion passed for a=&b=!
Assertion passed for a%5B0%5D=1&a%5B3%5D=2&a%5B4%5D=3&a%5B5%5D=4&b=4&c%5B0%5D=red&c%5B1%5D=blue&c%5B2%5D=orange&c%5B3%5D=yellow&d=yes!