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

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM