利用PHP函数计算中英文字符串长度的方法
发布时间:2016-11-02, 10:56:14 分类:PHP | 编辑 off 网址 | 辅助
正文 588字数 532,662阅读
一般来说大家知道英文字符占一个字节,而中文字符gbk占两个字符,utf8占三个字符,很多人印象中php计算字符串长度就是strlen()函数,其实不然,它计算的是字节的长度而非字符的长度,那么如何获取一个字符串中字符的长度呢?还有有mb_strlen().echo $str = 'PHP点点通';
echo strlen($str); //3*1+3*3=12
echo mb_strlen($str, 'gb2312'); //3*1+3*2=9
echo mb_strlen($str, 'utf-8'); //6
Run code
Cut to clipboard
可恶的是,mb系列的函数并不是PHP核心函数,默认没有开启的,还有一个超简单的方法,通过正则将字符串分解为字符个体,计算字符的个数即为字符串的长度,
<?php
function _strlen($str)
{
preg_match_all("/./us", $str, $matches);
return count(current($matches));
}
echo _strlen("PHP点点通"); //6
Run code
Cut to clipboard
(支付宝)给作者钱财以资鼓励 (微信)→
有过 3 条评论 »
第一种方法:
用到的函数:
str_split:把字符串分割到数组中。类似的函数explode() 函数把字符串分割为数组。array_count_values:用于统计数组中所有值出现的次数。
arsort:对数组进行逆向排序并保持索引关系。
主要用于对那些单元顺序很重要的结合数组进行排序。$str="asdfgfdas323344##$\$fdsdfg*$**$*$**$$443563536254fas";//任意长度字符串
代码如下:
$arr=str_split($str); $arr=array_count_values($arr); arsort($arr); print_r($arr);
输出:
Array( [$] => 7 [3] => 6 [*] => 6 [4] => 5 [f] => 5 [s] => 4 [d] => 4 [5] => 3 [a] => 3 [6] => 2 [2] => 2 [g] => 2 [#] => 2 )
第二种方法:
用到的函数:
array_unique:删除数组中重复的值。substr_count:计算子串在字符串中出现的次数。
代码如下:
$str="asdfgfdas323344##$\$fdsdfg*$**$*$**$$443563536254fas";//任意长度字符串 $arr=str_split($str); $unique=array_unique($arr); foreach ($unique as $a){ $arr2[$a]=substr_count($str, $a); } arsort($arr2); print_r($arr2);
在php里当需要判断一个字符串长度时,我们首先想到的是strlen()函数,不错,strlen()返回的就是字符串的长度,这样使用没有任何问题。不过,如果要从php程序优化的角度来看,使用strlen()判断字符串长度未免是最好的写法
有经验的程序员发现,php判断字符串长度,使用isset()在速度上比strlen()更快,执行效率更高。
即:
$str = ‘aaaaaa'; if(strlen($str) > 6) VS if(!isset($str{6})
用例子简单测试下,情况基本属实,isset()效率几乎是strlen()的3倍。
示例:
<?php //使用strlen方式 $arr = "123456"; $sTime = microtime(1); if(strlen($arr) > 6){ // echo 1; } echo microtime(1) - $sTime;
输出:0.00035595893859863
<?php //使用isset($arr{})方式 $arr = "123456"; $sTime = microtime(1); if(!isset($arr{6})){ // echo "1\r\n"; } echo microtime(1) - $sTime;
输出:0.00019097328186035
isset()速度为什么比strlen()更快
strlen()函数函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。
在某些情况下,使用isset() 技巧可以加速执行你的代码。因为与isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。
因此调用isset()比strlen()快。
本文实例讲述了php中关于长度计算容易混淆的问题。
经常被php中数组和字符串的字符函数搞晕,下面总结一下:
strlen($string)函数:计算字符串的长度;
sizeof($string,$mode)函数:它是count()函数的别名,count()函数如下:
int count ( mixed var [, int mode] )
返回 var 中的单元数目,通常是一个 array,任何其它类型都只有一个单元。
对于对象,如果安装了 SPL,可以通过实现 Countable 接口来调用 count()。该接口只有一个方法 count(),此方法返回 count() 函数的返回值。
如果 var 不是数组类型或者实现了 Countable 接口的对象,将返回 1,有一个例外,如果 var 是 NULL 则结果是 0。
注: 可选的 mode 参数自 PHP 4.2.0 起可用。
如果可选的 mode 参数设为 COUNT_RECURSIVE(或 1),count() 将递归地对数组计数。对计算多维数组的所有单元尤其有用。mode 的默认值是 0。count() 识别不了无限递归。
总之,字符串用strlen(),数组用sizeof()即可。
《php操作office文档技巧总结(包括word,excel,access,ppt)》、《PHP数组(Array)操作技巧大全》、《php排序算法总结》、《PHP常用遍历算法与技巧总结》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《PHP数学运算技巧总结》、《php正则表达式用法总结》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》及《php常见数据库操作技巧汇总》