14
2013-01

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

有这样一种需求,将形式为“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.'<br />';
}

两种写法各有优势:

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

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



除非注明,文章均为史亚永原创,欢迎转载!转载请注明本文地址,谢谢。

本文地址:http://www.shiyayong.cn/post/102.html

评论列表:

12  熊猫家族  2013-1-17 10:15:50 回复该留言  IP:219.142.18.122
好吧, 终于知道啦 谢谢分享
  茶馆老板  2013-1-17 13:19:40 回复该留言  IP:124.205.133.34
你也是搞php程序的吗?
茶馆老板
熊猫家族
11  好运鞋  2013-1-16 9:06:16 回复该留言  IP:60.213.160.114
现在明白网络茶馆的意思了。
  茶馆老板  2013-1-16 9:12:41 回复该留言  IP:124.205.133.34
此茶馆,非彼茶馆,要不怎么叫网络茶馆呢
茶馆老板
好运鞋
10  Leniy  2013-1-16 8:02:27 回复该留言  IP:60.211.191.214
晕,用这种方法
  茶馆老板  2013-1-16 8:57:35 回复该留言  IP:124.205.133.34
这种方法怎么了啊?
茶馆老板
Leniy
9  CAD2012下载  2013-1-15 17:23:03 回复该留言  IP:58.63.140.253
哈哈,因为我不懂程序,这些看起来还蛮复杂的呢。
  茶馆老板  2013-1-15 21:25:29 回复该留言  IP:220.181.73.124
没事,多看慢慢的就熟悉了
茶馆老板
CAD2012下载
8  我的名字叫麒  2013-1-15 16:25:34 回复该留言  IP:27.227.198.182
完全不懂代码的飘过~~~
  茶馆老板  2013-1-15 16:36:05 回复该留言  IP:124.205.133.34
不懂可以慢慢学的,慢慢看的,看得多了就看出门道来了
茶馆老板
我的名字叫麒
7  充气娃娃  2013-1-15 14:59:19 回复该留言  IP:122.70.96.152
技术类的博客容易推广。。。我们这些产品博客怎么去推呢?
  茶馆老板  2013-1-15 15:05:19 回复该留言  IP:124.205.133.34
产品类的博客,主要依靠分类信息,一些B2B平台
茶馆老板
充气娃娃
6  我爱搜罗网  2013-1-15 14:38:01 回复该留言  IP:218.11.179.40
基本看不懂,还有待学习O(∩_∩)O~
  茶馆老板  2013-1-15 15:03:39 回复该留言  IP:124.205.133.34
技术是需要不断地学习的哦,推广类的应该可以看懂吧
茶馆老板
我爱搜罗网
5  千金良方  2013-1-15 14:30:15 回复该留言  IP:116.252.246.225
本來想學習PHP的不過要學的太多了,所以就不學了,還是學習如何推廣的好。
  茶馆老板  2013-1-15 15:03:05 回复该留言  IP:124.205.133.34
推广也不算是个技术活吧,要看你多看,多观察
茶馆老板
千金良方
4  行畔博客  2013-1-15 14:06:54 回复该留言  IP:223.95.6.71
我是来捧场的,表示看不懂
  茶馆老板  2013-1-15 15:02:31 回复该留言  IP:124.205.133.34
那以后多来哦,有你可以看懂的哦,在电脑基础和网络茶寮,以及站长趣闻栏目你都可以看懂的,很好笑的
茶馆老板
行畔博客
3  一格电  2013-1-15 14:04:03 回复该留言  IP:117.136.9.68
亲,这个评论框上的广告你是怎么加上的,还有文章最下面的那个广告图片是环绕型广告吗,我在网上搜教程,全都不正确。。。汗
  茶馆老板  2013-1-15 15:01:55 回复该留言  IP:124.205.133.34
不是啊,都是添加代码,用样式控制的,只要控制好样式,广告代码好加
茶馆老板
一格电
2  牛逼思维  2013-1-14 14:10:11 回复该留言  IP:111.222.80.70
不懂,纯粹吼一吼。。
  茶馆老板  2013-1-14 14:25:36 回复该留言  IP:124.205.133.34
你那个要是狮吼功就好了,一下子就可以把我的网站给宣传到世界各地了,哈哈
茶馆老板
牛逼思维
1  php程序员教程  2013-1-14 12:51:17 回复该留言  IP:58.210.45.118
我怎么感觉我瞬间想到的是第二种方法呢? eval 这个函数还真没有常用过。。。。
  茶馆老板  2013-1-14 13:05:08 回复该留言  IP:124.205.133.34
方法贵在实用啊
茶馆老板
php程序员教程

发表评论:

(设置个性头像)

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

无觅相关文章插件,快速提升流量