前段时间有同学提了个问题,怎么处理类似这种格式的字符串abc=abcval&kaka=kakaval&haha=hahaval&test=testval
,以生成以下这种变量:
$abc = 'abcval'; $kaka = 'kakaval'; $haha = 'hahaval'; $test = 'testval';
刚开始我并不知道有parse_str()
这个函数,于是写了以下算是比较长的代码:
$query_string = 'abc=abcval&kaka=kakaval&haha=hahaval&test=testval';
$query_arr = explode('&', $query_string);
$res = [];
foreach ($query_arr as $key => $val) {
${strstr($val, '=', true)} = substr($val, strpos($val, '=') + 1);
}
今天读某框架源码,发现了一个没用过的函数parse_str()
,马上想起同学之前提的问题,没想到当时花了一两分钟写的代码只需要一个函数就搞定了:
$query_string = 'abc=abcval&kaka=kakaval&haha=hahaval&test=testval';
parse_str($query_string);
当然,parse_str()
还可以返回数组形式的变量,此处就不多说。事情就这样完了么?怎么可能,喜欢打破沙锅问到底的我不可能不深究。
发现了parse_str()
,玩了一会,发现之前所写的代码有些漏洞。初步发现在以下情况时返回的结果不对:
$query_string = 'abc=abcval&kaka=kakaval&=&haha&test';
于是改造了一下:
$query_string = 'abc=abcval&kaka=kakaval&=&haha&test';
$query_arr = explode('&', $query_string);
$res = [];
foreach ($query_arr as $key => $val) {
if ($val != '=' && $val != '') {
if (strstr($val, '=', true)) {
${strstr($val, '=', true)} = substr($val, strpos($val, '=') + 1);
} else {
${$val} = '';
}
}
}
暂时来看,修改后的代码应该是没问题的。但是毕竟水平有限,能力之外的情况就无法考虑了,只是尽自己的认知去完善。
现实会有大量现成的方法去解决问题,如这次有PHP内置函数,可比我自己写的代码方便简洁多了,更不需要考虑各种各样的意外。然而成长有时候需要朝抵抗力最大的路径走,这条路或许没有芬芳,并不平坦,却有不一样的风景,收获的是不一样的心境。