php将一个字符串转变成键值对数组的效率问题
有这样一种需求,将形式为“TranAbbr=IPER|AcqSsn=000000073601|MercDtTm=20090615144037”的字符串转换成如下格式的数组:
Array ( [TranAbbr] => IPER [AcqSsn] => 000000073601 [MercDtTm] => 20090615144037
)
1.第一种方式
/* 将一个字符串转变成键值对数组 * @param : string str 要处理的字符串 $str ='TranAbbr=IPER|AcqSsn=000000073601|MercDtTm=20090615144037'; * @param : string sp 键值对分隔符 * @param : string kv 键值分隔符 * @return : array*/ function str2arr ($str,$sp="|",$kv="=") { $arr = str_replace(array($kv,$sp),array('"=>"','","'),'array("'.$str.'")'); eval("\$arr"." = $arr;"); // 把字符串作为PHP代码执行 return $arr; }
2.第二种方式
//传统的做法 function str2arr1 ($str){ $arr = explode("|",$str); $r = array(); foreach ($arr as $val ){ $t = explode("=",$val); $r[$t[0]]= $t[1]; } return $r; } $a='TranAbbr=IPER|AcqSsn=000000073601|MercDtTm=20090615144037|TranAbbr=IPER|AcqSsn=000000073601|MercDtTm=20090615144037|TranAbbr=IPER|AcqSsn=000000073601|MercDtTm=20090615144037|TranAbbr=IPER|AcqSsn=000000073601|MercDtTm=20090615144037|TranAbbr=IPER|AcqSsn=000000073601|MercDtTm=20090615144037|TranAbbr=IPER|AcqSsn=000000073601|MercDtTm=20090615144037|TranAbbr=IPER|AcqSsn=000000073601|MercDtTm=20090615144037|TranAbbr=IPER|AcqSsn=000000073601|MercDtTm=20090615144037|TranAbbr=IPER|AcqSsn=000000073601|MercDtTm=20090615144037|TranAbbr=IPER|AcqSsn=000000073601|MercDtTm=20090615144037|TranAbbr=IPER|AcqSsn=000000073601|MercDtTm=20090615144037|TranAbbr=IPER|AcqSsn=000000073601|MercDtTm=20090615144037|TranAbbr=IPER|AcqSsn=000000073601|MercDtTm=20090615144037|TranAbbr=IPER|AcqSsn=000000073601|MercDtTm=20090615144037'; for ($i=0;$i<50;$i++){ $t = microtime(); $b = str2arr1($a); $t1 = microtime(); str2arr($a); $t2 = microtime(); echo $t2+$t-2*$t1.'<br />'; }
两种写法各有优势:
1、 第一种容易想到,耳熟能详;第二种不容易想到,且eval函数在使用时要注意安全隐患。
2、 当待处理的字符串最终转成的数组比较庞大时,第二种方法的效率将大大高于传统的做法。