php中strtr和str_replace的坑

   str_replace这个函数比较无脑
<?php


$a = 'abcxy';
echo str_replace(array('abc', 'xy'), array('xy', 'abc'), $a),'<br/>';


?>


    你想输出 xyabc, 但是实际是:abcabc,因为它是循环替换。
    str_replace格式如下
    str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )
    $search的长度,决定了$subject被循环替换了几次,$search越长,效率越底。
    解决办法,使用功能更强大,但更慢的strtr函数。


<?php


$a = 'abcxy';
echo strtr($a, array('abc'=>'xy', 'xy'=>'abc')),'<br/>';


?>


    取得期望结果:xyabc。
    strtr的结构 string strtr ( string $str , array $replace_pairs )
    为什么strtr更慢呢?strtr虽然不会多次循环替换字符串。但它可能会把$replace_pairs按键的长度排序,键长的排前面(从结果上看可能是这样的)。


<?php


$a = 'abcxy';
echo strtr($a, array('abc'=>'123', 'xy'=>'45', 'abcxy'=>'qwertyu')),'<br/>';


?>


    结果是: qwertyu, 明显是先用 'abcxy'=>'qwertyu' 进行的替换。所以strtr比str_replace慢,但strtr只循环替换一次,str_replace如果循环替换次数有十几次的话,效率就和strtr差不多了。
    如果$search的数组很长,且不需要前面的特殊效果,用strtr要快很多。但网传strtr函数的效率是str_replace函数的四倍,这也是事实,但前提是strtr这种结构: string strtr ( string $str , string $from , string $to )


<?php


$a = 'abcxy';
echo strtr($a, 'cba', '321'),'<br/>';


?>
    结果变成了 123xy, 说明strtr这种格式是基于char的替换。可以利用这一点写个简单的凯撒密码函数。


function caesar_cipher($str)
{
    return strtr($str, '+/=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', '-_,ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba');
}




    CodeIgniter里没有strtr函数, Yii中没有str_replace函数,看来这些写框架中的人都有些偏执。一般来说str_replace在多数情况下是够用了。


    

下面是对str_replace和strtr的效率测试代码。


[php]  view plain copy
  1. <meta charset="utf-8">  
  2. <?php  
  3.   
  4. $a = 'a:61:{i:0;a:88:{i:0;s:11:"semo?><:-or";emoor";i:1;s:6:"public";s:12:"table_schema"is_updatable";s:3:"YES";}i:60;a:88:{i:0;s:6:"semoor";s:13:"table_catalog";s:6:"semoor";i:1;s:6:"public";s:12:"table_schema";s:6:"public";i:2;s:8:"t_detail";s:10:"table_name";s:8:"t_detail";i:3;s:8:"std_name";s:11:"column_name";s:8:"std_name";i:4;s:2:"61";s:16:"ordinal_position";s:2:"61";i:5;N;s:14:"column_default";N;i:6;s:3:"YES";s:11:"is_nullable";s:3:"YES";i:7;s:17:"character varying";s:9:"data_type";s:17:"character varying";i:8;s:2:"20";s:24:"character_maximum_length";s:2:"20";i:9;s:10:"1073741824";s:22:"character_octet_length";s:10:"1073741824";i:10;N;s:17:"numeric_precision";N;i:11;N;s:23:"numeric_precision_radix";N;i:12;N;s:13:"numeric_scale";N;i:13;N;s:18:"datetime_precision";N;i:14;N;s:13:"interval_type";N;i:15;N;s:18:"interval_precision";N;i:16;N;s:21:"character_set_catalog";N;i:17;N;s:20:"character_set_schema";N;i:18;N;s:18:"character_set_name";N;i:19;N;s:17:"collation_catalog";N;i:20;N;s:16:"collation_schema";N;i:21;N;s:14:"collation_name";N;i:22;N;s:14:"domain_catalog";N;i:23;N;s:13:"domain_schema";N;i:24;N;s:11:"domain_name";N;i:25;s:6:"semoor";s:11:"udt_catalog";s:6:"semoor";i:26;s:10:"pg_catalog";s:10:"udt_schema";s:10:"pg_catalog";i:27;s:7:"varchar";s:8:"udt_name";s:7:"varchar";i:28;N;s:13:"scope_catalog";N;i:29;N;s:12:"scope_schema";N;i:30;N;s:10:"scope_name";N;i:31;N;s:19:"maximum_cardinality";N;i:32;s:2:"61";s:14:"dtd_identifier";s:2:"61";i:33;s:2:"NO";s:19:"is_self_referencing";s:2:"NO";i:34;s:2:"NO";s:11:"is_identity";s:2:"NO";i:35;N;s:19:"identity_generation";N;i:36;N;s:14:"identity_start";N;i:37;N;s:18:"identity_increment";N;i:38;N;s:16:"identity_maximum";N;i:39;N;s:16:"identity_minimum";N;i:40;N;s:14:"identity_cycle";N;i:41;s:5:"NEVER";s:12:"is_generated";s:5:"NEVER";i:42;N;s:21:"generation_expression";N;i:43;s:3:"YES";s:12:"is_updatable";s:3:"YES";}}';  
  5. $b = base64_encode($a);  
  6. $start = microtime(true);  
  7.   
  8. /* for ($i=65; $i<91; ++$i) 
  9. { 
  10.     echo chr($i); 
  11. } 
  12.  
  13. for ($j=90; $j>64; --$j) 
  14. { 
  15.     echo chr($j); 
  16. } 
  17.  */  
  18.   
  19. for ($i=0; $i<100; ++$i)  
  20. {  
  21.     // str_replace(array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','+','/','='), array('Z','Y','X','W','V','U','T','S','R','Q','P','O','N','M','L','K','J','I','H','G','F','E','D','C','B','z','y','x','w','v','u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','-','_',','), $b);  
  22.       
  23.     // str_replace(array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'), array('Z','Y','X','W','V','U','T','S','R','Q','P','O','N','M','L','K','J','I','H','G','F','E','D','C','B','A'), $b);  
  24.     // str_replace(array('+', '/', '=', 'A','B','C','D','E','F','G','H','I','J'), array('-', '_', ',', 'Z','Y','X','W','V','U','T','S','R','Q'), $b);  
  25.     // str_replace(array('+', '/', '='), array('-', '_', ','), $b);  
  26.     // strtr($b, array('A' => 'Z','B' => 'Y','C' => 'X','D' => 'W','E' => 'V','F' => 'U','G' => 'T','H' => 'S','I' => 'R','J' => 'Q','K' => 'P','L' => 'O','M' => 'N','N' => 'M','O' => 'L','P' => 'K','Q' => 'J','R' => 'I','S' => 'H','T' => 'G','U' => 'F','V' => 'E','W' => 'D','X' => 'C','Y' => 'B','z' => 'a','a' => 'z','b' => 'y','c' => 'x','d' => 'w','e' => 'v','f' => 'u','g' => 't','h' => 's','i' => 'r','j' => 'q','k' => 'p','l' => 'o','m' => 'n','n' => 'm','o' => 'l','p' => 'k','q' => 'j','r' => 'i','s' => 'h','t' => 'g','u' => 'f','v' => 'e','w' => 'd','x' => 'c','y' => 'b','z' => 'a','+'=>'-','/'=>'_','='=>','));  
  27.     // strtr($b, array('+' => '-', '/' => '_', '=' => ',', 'A' => 'Z','B' => 'Y','C' => 'X','D' => 'W','E' => 'V','F' => 'U','G' => 'T','H' => 'S','I' => 'R','J' => 'Q'));  
  28.     // strtr($b, array('+'=>'-','/'=>'_','='=>','));  
  29.     // strtr($b, '+/=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', '-_,ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba');  
  30.     // str_replace('€', '', strtr($b, '+/=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', '€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€'));  
  31.     // str_replace(' ', '', strtr($b, '+/=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', '                                                       '));  
  32.     // str_replace(array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','+','/','='), '', $b);  
  33.     // strtr($b, '+/=', '-_,');  
  34.     // ltrim(strtr($b, '+/', '-_'), '=');  
  35.       
  36.     // rawurlencode($a);  
  37. }  
  38. printf('运行花%.5f,内存为%dKB<br/>',   
  39.     microtime(true) - $start, memory_get_peak_usage() / 1024);  
  40.   
  41. /*  */  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值