入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

php将一个字符串转变成键值对数组的效率问题

创建时间:2016-01-25 投稿人: 浏览次数:3748

有这样一种需求,将形式为“TranAbbr=IPER|AcqSsn=000000073601|MercDtTm=20090615144037”的字符串转换成如下格式的数组:

Array
(
    [TranAbbr] => IPER
    [AcqSsn] => 000000073601
    [MercDtTm] => 20090615144037
)
/* 将一个字符串转变成键值对数组
 * @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;
}

做如下测试:(你就明白了)

/* 将一个字符串转变成键值对数组
     * @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."")");
        echo $arr."<br>";
        eval("$arr"." = $arr;");
        return $arr;
    }

    echo "<pre>";
    print_r(str2arr("TranAbbr=IPER|AcqSsn=000000073601|MercDtTm=20090615144037"));

    var_dump(str2arr("TranAbbr=IPER|AcqSsn=000000073601|MercDtTm=20090615144037"));
    echo "</pre>";
array("TranAbbr"=>"IPER","AcqSsn"=>"000000073601","MercDtTm"=>"20090615144037")
Array
(
    [TranAbbr] => IPER
    [AcqSsn] => 000000073601
    [MercDtTm] => 20090615144037
)
array("TranAbbr"=>"IPER","AcqSsn"=>"000000073601","MercDtTm"=>"20090615144037")
array(3) {
  ["TranAbbr"]=>
  string(4) "IPER"
  ["AcqSsn"]=>
  string(12) "000000073601"
  ["MercDtTm"]=>
  string(14) "20090615144037"
}

一般时候,大家很容易想到用explode和foreach来处理,代码如下:

//传统的做法
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、 当待处理的字符串最终转成的数组比较庞大时,第二种方法的效率将大大高于传统的做法。

阅读更多
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。