<?php
/**
* Like array_merge, but will recursively merge array values.
*
* @param array $a1
* The array to be merged into.
* @param array $a2
* The array to merge in. Overwrites $a1, when string keys conflict.
* Numeric keys will just be appended.
* @return array
* The array, post-merge.
*/
function merge_query_var_arrays( $a1 , $a2 ) {
foreach ( $a2 as $k2 => $v2 )
$a1 [ $k2 ] = isset ( $a1 [ $k2 ] ) && is_array ( $v2 ) ? merge_query_var_arrays
( $a1 [ $k2 ] , $v2 ) : $v2 ; else
$a1 [ ] = $v2 ;
return $a1 ;
}
/**
* @param string $query_string
* The URL or query string to add to.
* @param string|array $vars_to_add
* Either a string in var=val&[...] format, or an array.
* @return string
* The new query string. Duplicate vars are overwritten.
*/
function add_query_vars( $query_string , $vars_to_add ) {
$query_vars = merge_query_var_arrays( $query_vars , $vars_to_add ) ;
}
function assertEquals( $a , $b ) {
if ( $a === $b ) {
echo "Assertion passed for $a !\n " ;
return true ;
}
echo "Failed assertion; got: $a \n " ;
echo " expected: $b \n " ;
return false ;
}
header ( "Content-Type: text/plain" ) ; assertEquals( add_query_vars( "" , "" ) ,
"" ) ;
assertEquals( add_query_vars( "http://w...content-available-to-author-only...e.ca/search?q=abc&oq=ab" , "" ) ,
"http://w...content-available-to-author-only...e.ca/search?q=abc&oq=ab" ) ;
assertEquals( add_query_vars( "?a=1&b=2" , "" ) ,
"?a=1&b=2" ) ;
assertEquals( add_query_vars( "a&b=0" , "" ) ,
"a=&b=0" ) ;
assertEquals( add_query_vars( "a[]=1&a[3]=2&a[]=3&b=4" , "" ) ,
assertEquals( add_query_vars( "" , "a=1&b=2" ) ,
"a=1&b=2" ) ;
assertEquals( add_query_vars( "http://w...content-available-to-author-only...e.ca/search?q=abc&oq=ab" , "oq=cba&ie=UTF-8" ) ,
"http://w...content-available-to-author-only...e.ca/search?q=abc&oq=cba&ie=UTF-8" ) ;
assertEquals
( add_query_vars
( "?a=1&b=2" , array ( 'c' => 3 , 'a' =>- 1 ) ) , "?a=-1&b=2&c=3" ) ;
assertEquals( add_query_vars( "a&b=0" , "b" ) ,
"a=&b=" ) ;
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" ) ) ) , 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" ) ) ;
PD9waHAKCi8qKgogKiAgTGlrZSBhcnJheV9tZXJnZSwgYnV0IHdpbGwgcmVjdXJzaXZlbHkgbWVyZ2UgYXJyYXkgdmFsdWVzLgogKgogKiAgQHBhcmFtIGFycmF5ICRhMQogKiAgICAgIFRoZSBhcnJheSB0byBiZSBtZXJnZWQgaW50by4KICogIEBwYXJhbSBhcnJheSAkYTIKICogICAgICBUaGUgYXJyYXkgdG8gbWVyZ2UgaW4uIE92ZXJ3cml0ZXMgJGExLCB3aGVuIHN0cmluZyBrZXlzIGNvbmZsaWN0LgogKiAgICAgIE51bWVyaWMga2V5cyB3aWxsIGp1c3QgYmUgYXBwZW5kZWQuCiAqICBAcmV0dXJuIGFycmF5CiAqICAgICAgVGhlIGFycmF5LCBwb3N0LW1lcmdlLgogKi8KZnVuY3Rpb24gbWVyZ2VfcXVlcnlfdmFyX2FycmF5cygkYTEsICRhMikgewogICAgZm9yZWFjaCAoJGEyIGFzICRrMiA9PiAkdjIpCiAgICAgICAgaWYgKGlzX3N0cmluZygkazIpKQogICAgICAgICAgICAkYTFbJGsyXSA9IGlzc2V0KCRhMVskazJdKSAmJiBpc19hcnJheSgkdjIpID8gbWVyZ2VfcXVlcnlfdmFyX2FycmF5cygkYTFbJGsyXSwgJHYyKSA6ICR2MjsKICAgICAgICBlbHNlCiAgICAgICAgICAgICRhMVtdID0gJHYyOwogICAgcmV0dXJuICRhMTsKfQoKLyoqCiAqICBAcGFyYW0gc3RyaW5nICRxdWVyeV9zdHJpbmcKICogICAgICBUaGUgVVJMIG9yIHF1ZXJ5IHN0cmluZyB0byBhZGQgdG8uCiAqICBAcGFyYW0gc3RyaW5nfGFycmF5ICR2YXJzX3RvX2FkZAogKiAgICAgIEVpdGhlciBhIHN0cmluZyBpbiB2YXI9dmFsJlsuLi5dIGZvcm1hdCwgb3IgYW4gYXJyYXkuCiAqICBAcmV0dXJuIHN0cmluZwogKiAgICAgIFRoZSBuZXcgcXVlcnkgc3RyaW5nLiBEdXBsaWNhdGUgdmFycyBhcmUgb3ZlcndyaXR0ZW4uCiAqLwpmdW5jdGlvbiBhZGRfcXVlcnlfdmFycygkcXVlcnlfc3RyaW5nLCAkdmFyc190b19hZGQpIHsKICAgIGlmIChpc19zdHJpbmcoJHZhcnNfdG9fYWRkKSkKICAgICAgICBwYXJzZV9zdHIoJHZhcnNfdG9fYWRkLCAkdmFyc190b19hZGQpOwogICAgaWYgKHByZWdfbWF0Y2goJy8uKlw/LycsICRxdWVyeV9zdHJpbmcsICRtYXRjaCkpCiAgICAgICAgJHF1ZXJ5X3N0cmluZyA9IHByZWdfcmVwbGFjZSgnLy4qXD8vJywgJycsICRxdWVyeV9zdHJpbmcpOwogICAgcGFyc2Vfc3RyKCRxdWVyeV9zdHJpbmcsICRxdWVyeV92YXJzKTsKICAgIAogICAgJHF1ZXJ5X3ZhcnMgPSBtZXJnZV9xdWVyeV92YXJfYXJyYXlzKCRxdWVyeV92YXJzLCAkdmFyc190b19hZGQpOwogICAgcmV0dXJuIEAkbWF0Y2hbMF0gLiBodHRwX2J1aWxkX3F1ZXJ5KCRxdWVyeV92YXJzKTsKfQoKZnVuY3Rpb24gYXNzZXJ0RXF1YWxzKCRhLCAkYikgewoJaWYgKCRhID09PSAkYikgewoJCWVjaG8gIkFzc2VydGlvbiBwYXNzZWQgZm9yICRhIVxuIjsKCQlyZXR1cm4gdHJ1ZTsKCX0KCWVjaG8gIkZhaWxlZCBhc3NlcnRpb247IGdvdDogJGFcbiI7CgllY2hvICIgICAgICAgICAgICAgZXhwZWN0ZWQ6ICRiXG4iOwoJcmV0dXJuIGZhbHNlOwp9CgpoZWFkZXIoIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbiIpOwphc3NlcnRFcXVhbHMoYWRkX3F1ZXJ5X3ZhcnMoIiIsICIiKSwKICAgICAgICAgICAgICIiKTsKYXNzZXJ0RXF1YWxzKGFkZF9xdWVyeV92YXJzKCJodHRwOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jYS9zZWFyY2g/cT1hYmMmb3E9YWIiLCAiIiksCiAgICAgICAgICAgICAiaHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmUuY2Evc2VhcmNoP3E9YWJjJm9xPWFiIik7CmFzc2VydEVxdWFscyhhZGRfcXVlcnlfdmFycygiP2E9MSZiPTIiLCAiIiksCiAgICAgICAgICAgICAiP2E9MSZiPTIiKTsKYXNzZXJ0RXF1YWxzKGFkZF9xdWVyeV92YXJzKCJhJmI9MCIsICIiKSwKICAgICAgICAgICAgICJhPSZiPTAiKTsKYXNzZXJ0RXF1YWxzKGFkZF9xdWVyeV92YXJzKCJhW109MSZhWzNdPTImYVtdPTMmYj00IiwgIiIpLAogICAgICAgICAgICAgc3RyX3JlcGxhY2UoYXJyYXkoIlsiLCAiXSIpLCBhcnJheSgiJTVCIiwgIiU1RCIpLCAiYVswXT0xJmFbM109MiZhWzRdPTMmYj00IikpOwoKYXNzZXJ0RXF1YWxzKGFkZF9xdWVyeV92YXJzKCIiLCAiYT0xJmI9MiIpLAogICAgICAgICAgICAgImE9MSZiPTIiKTsKYXNzZXJ0RXF1YWxzKGFkZF9xdWVyeV92YXJzKCJodHRwOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jYS9zZWFyY2g/cT1hYmMmb3E9YWIiLCAib3E9Y2JhJmllPVVURi04IiksCiAgICAgICAgICAgICAiaHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmUuY2Evc2VhcmNoP3E9YWJjJm9xPWNiYSZpZT1VVEYtOCIpOwphc3NlcnRFcXVhbHMoYWRkX3F1ZXJ5X3ZhcnMoIj9hPTEmYj0yIiwgYXJyYXkoJ2MnPT4zLCdhJz0+LTEpKSwKICAgICAgICAgICAgICI/YT0tMSZiPTImYz0zIik7CmFzc2VydEVxdWFscyhhZGRfcXVlcnlfdmFycygiYSZiPTAiLCAiYiIpLAogICAgICAgICAgICAgImE9JmI9Iik7CmFzc2VydEVxdWFscyhhZGRfcXVlcnlfdmFycygiYVtdPTEmYVszXT0yJmFbXT0zJmI9NCZjW109cmVkJmNbXT1ibHVlIiwgYXJyYXkoImEiID0+IGFycmF5KDQpLCAiZCIgPT4gInllcyIsICJjIiA9PiBhcnJheSgib3JhbmdlIiwgInllbGxvdyIpKSksCiAgICAgICAgICAgICBzdHJfcmVwbGFjZShhcnJheSgiWyIsICJdIiksIGFycmF5KCIlNUIiLCAiJTVEIiksICJhWzBdPTEmYVszXT0yJmFbNF09MyZhWzVdPTQmYj00JmNbMF09cmVkJmNbMV09Ymx1ZSZjWzJdPW9yYW5nZSZjWzNdPXllbGxvdyZkPXllcyIpKTsK