我遇到了这段代码......
if(isset($string[255])) {
// too long
}
Run Code Online (Sandbox Code Playgroud)
isset()比6到40快
if(strlen($string) > 255) {
// too long
}
Run Code Online (Sandbox Code Playgroud)
isset()的唯一缺点是代码不清楚 - 我们无法立即知道正在做什么(参见pekka的回答).我们可以在一个函数中包装isset(),即strlt($ string,255),但我们会失去isset()的速度优势.
我们如何在保留代码可读性的同时使用更快的isset()函数?
编辑:测试显示速度http://codepad.org/ztYF0bE3
strlen() over 1000000 iterations 7.5193998813629
isset() over 1000000 iterations 0.29940009117126
Run Code Online (Sandbox Code Playgroud)
EDIT2:这就是为什么isset()更快
$string = 'abcdefg';
var_dump($string[2]);
Output: string(1) “c”
$string = 'abcdefg';
if (isset($string[7])){
echo $string[7].' found!';
}else{
echo 'No character found at position 7!';
}
Run Code Online (Sandbox Code Playgroud)
这比使用strlen()更快,因为"...调用函数比使用语言结构更昂贵." http://www.phpreferencebook.com/tips/use-isset-instead-of-strlen/
EDIT3:我总是被教导对mirco-optimization感兴趣.可能是因为我在计算机上的资源很少的时候被教过.我对这个可能并不重要的观点持开放态度,在答案中有一些好的论据反对它.我已经开始探索这个问题... /sf/ask/488824591/
如何使用索引逐字符迭代UTF-8字符串?
当您使用括号运算符访问UTF-8字符串时,$str[0]utf编码的字符由2个或更多元素组成.
例如:
$str = "K?t";
$str[0] = "K";
$str[1] = "?";
$str[2] = "?";
$str[3] = "t";
Run Code Online (Sandbox Code Playgroud)
但我希望:
$str[0] = "K";
$str[1] = "?";
$str[2] = "t";
Run Code Online (Sandbox Code Playgroud)
这是可能的,mb_substr但这是非常缓慢的,即.
mb_substr($str, 0, 1) = "K"
mb_substr($str, 1, 1) = "?"
mb_substr($str, 2, 1) = "t"
Run Code Online (Sandbox Code Playgroud)
是否有另一种方法来逐字符串字符串而不使用mb_substr?