.
() $break_dots ( , ).
function parse_name ($str, $break_dot = false) {
$out = array();
$buf = '';
$acount = 0;
$lastbroke = false;
foreach (str_split($str) as $c) {
switch ($c) {
case '[':
if ($acount == 0) {
if (!$lastbroke) $out[] = $buf;
$buf = "";
$acount++;
$lastbroke = false;
} else return array($str);
break;
case ']':
if ($acount == 1) {
if (!$lastbroke) $out[] = $buf;
$buf = '';
$acount--;
$lastbroke = true;
} else return array($str);
break;
case '.':
if ($break_dot) {
if (!$lastbroke) $out[] = $buf;
$buf = '';
$lastbroke = false;
break;
}
default:
$buf .= $c;
$lastbroke = false;
}
}
if ($acount > 0) return array($str);
if (!$lastbroke) $out[] = $buf;
return $out;
}
function decode_qstr ($str, $break_dots = false) {
$out = array();
$a = explode('&', $str);
foreach ($a as $param) {
$param = explode('=', $param, 2);
$key = parse_name($param[0], $break_dots);
$array = &$out;
$append = false;
foreach ($key as $k) {
if (!is_array($array)) $array = array();
if (empty($k)) {
$append = true;
break;
}
if (!isset($array[$k])) $array[$k] = NULL;
$tmp = &$array;
unset($array);
$array =& $tmp[$k];
unset($tmp);
}
if ($append) $array[] = $param[1];
else $array = $param[1];
unset($array);
}
return $out;
}
I tried to handle multi-level keys correctly. The code is a bit hacky, but it should work. I tried to comment on the code, comment if you have any questions.
Test case:
var_dump(decode_qstr("ProceduresCustomer.tipi_id=10&ProceduresCustomer.id=1"));
var_dump(decode_qstr("ProceduresCustomer.tipi_id=10&ProceduresCustomer.id=1", true));
svvac source
share