有這樣一種需求,將形式為“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、 當待處理的字符串最終轉成的數組比較龐大時,第二種方法的效率將大大高於傳統的做法。