知识大全 解析strtr函数的效率问题
Posted 函数
篇首语:泪水和汗水的化学成分相似,但前者只能为你换来同情,后者却可以为你赢得成功!本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 解析strtr函数的效率问题相关的知识,希望对你有一定的参考价值。
最近经常要对字符串进行匹配和替换操作 之前一般使用str_replace或者preg_replace 据说strtr的效率不错 所以对比了一下
复制代码 代码如下: $i = ; $t = microtime(true); for(;$i< ;$i++) $str = strtr(md ($i) $p ); var_dump(microtime(true) $t); // $t = microtime(true); for(;$i< ;$i++) $str = preg_replace($p md ($i)); var_dump(microtime(true) $t); //结果显示 strtr的效率比preg_replace高约 %左右 趁著周末 查看了strtr的php源码
复制代码 代码如下: PHP_FUNCTION(strtr) zval **str **from **to; int ac = ZEND_NUM_ARGS(); //参数检查(zend_get_parameters_ex函数定义在zend_api c文件中) if (ac < || ac > || zend_get_parameters_ex(ac &str &from &to) == FAILURE) WRONG_PARAM_COUNT; //参数检查 if (ac == && Z_TYPE_PP(from) != IS_ARRAY) php_error_docref(NULL TSRMLS_CC E_WARNING "The second argument is not an array "); RETURN_FALSE; convert_to_string_ex(str); /* shortcut for empty string */ //宏Z_STRLEN_PP定义在zend_operators h if (Z_STRLEN_PP(str) == ) RETURN_EMPTY_STRING(); if (ac == ) php_strtr_array(return_value Z_STRVAL_PP(str) Z_STRLEN_PP(str) HASH_OF(*from)); else convert_to_string_ex(from); convert_to_string_ex(to); ZVAL_STRINGL(return_value Z_STRVAL_PP(str) Z_STRLEN_PP(str) ); php_strtr(Z_STRVAL_P(return_value) Z_STRLEN_P(return_value) Z_STRVAL_PP(from) Z_STRVAL_PP(to) MIN(Z_STRLEN_PP(from) Z_STRLEN_PP(to)));先看看php_strtr函数
复制代码 代码如下: //trlen是字符串str_from与str_to的长度的最小值 PHPAPI char *php_strtr(char *str int len char *str_from char *str_to int trlen) int i; unsigned char xlat[ ]; // if ((trlen < ) || (len < )) return str; //xlat的下标与值相等 for (i = ; i < ; xlat[i] = i i++); //把from到to字符串的每一个字符对应起来 例如 from="ab" to="cd" 则会产生这样的对应 a => c b => d for (i = ; i < trlen; i++) xlat[(unsigned char) str_from[i]] = str_to[i]; //替换(不过觉得这个函数的效率还有可以改进的地方 因为如果需要替换的字符只是占整个字符串很少的部分 这样就有大部分的赋值操作其实并没有什么意义 这样的情况下感觉先判断再赋值感觉会高效一点 有空测试一下) for (i = ; i < len; i++) str[i] = xlat[(unsigned char) str[i]]; return str;可见 在处理strtr( abcdaaabcd ab efd )这样的操作时 应该是很高效的 (注意 这个操作输出efcdeeefcd) 再看看php_strtr_array
复制代码 代码如下: cha138/Article/program/PHP/201311/21131相关参考