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

有这样一种需求,将形式为“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;");

return $arr;

}

一般时候,大家很容易想到用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.'
';

}

两种写法各有优势:

1、第一种容易想到,耳熟能详;第二种不容易想到,且eval函数在使用时要注意安全隐患。

2、当待处理的字符串最终转成的数组比较庞大时,第二种方法的效率将大大高于传统的做法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值