|
|
|
|
|
在php里當需要判斷一個字符串長度時,我們首先想到的是strlen()函數(shù),不錯,strlen()返回的就是字符串的長度,這樣使用沒有任何問題。不過,如果要從php程序優(yōu)化的角度來看,使用strlen()判斷字符串長度未免是最好的寫法。
程序的優(yōu)化,需要經驗的積累,那是知識的沉淀,厚積薄發(fā)的體現(xiàn)。
有經驗的程序員發(fā)現(xiàn),php判斷字符串長度,使用isset()在速度上比strlen()更快,執(zhí)行效率更高。
因此,今天就分析一下strlen()和isset()這兩個函數(shù)。
PHP strlen() 函數(shù)
定義和用法
strlen() 函數(shù)返回字符串的長度。
語法
strlen(string)
參數(shù):string
描述:必需。規(guī)定要檢查的字符串。
實例
<?php
echo strlen("Hello world!");
?>
輸出:
12
PHP isset() 函數(shù)
isset函數(shù)是檢測變量是否設置。
格式:
bool isset ( mixed var [, mixed var [, ...]] )
返回值:
若變量不存在則返回 FALSE
若變量存在且其值為NULL,也返回 FALSE
若變量存在且值不為NULL,則返回 TURE
同時檢查多個變量時,每個單項都符合上一條要求時才返回 TRUE,否則結果為 FALSE
如果已經使用 unset() 釋放了一個變量之后,它將不再是 isset()。若使用 isset() 測試一個被設置成 NULL 的變量,將返回 FALSE。同時要注意的是一個 NULL 字節(jié)("")并不等同于 PHP 的 NULL 常數(shù)。
警告:
isset() 只能用于變量,因為傳遞任何其它參數(shù)都將造成解析錯誤。若想檢測常量是否已設置,可使用defined() 函數(shù)。
實例:
<?php
$var = '';
if (isset($var)) {
print "This var is set set so I will print.";
}
// 在后邊的例子中,我們將使用 var_dump函數(shù) 輸出 isset() 的返回值。
$a = "test";
$b = "anothertest";
var_dump( isset($a) ); // TRUE
var_dump( isset ($a, $b) ); // TRUE
unset ($a);
var_dump( isset ($a) ); // FALSE
var_dump( isset ($a, $b) ); // FALSE
$foo = NULL;
var_dump( isset ($foo) ); // FALSE
?>
導讀:var_dump()和print_r()在斷點調試程序時的區(qū)別
isset()速度為什么比strlen()更快
strlen()函數(shù)函數(shù)執(zhí)行起來相當快,因為它不做任何計算,只返回在zval 結構(C的內置數(shù)據結構,用于存儲PHP變量)中存儲的已知字符串長度。但是,由于strlen()是函數(shù),多多少少會有些慢,因為函數(shù)調用會經過諸多步驟,如字母小寫化(譯注:指函數(shù)名小寫化,PHP不區(qū)分函數(shù)名大小寫)、哈希查找,會跟隨被調用的函數(shù)一起執(zhí)行。
在某些情況下,使用isset() 技巧可以加速執(zhí)行你的代碼。因為與isset()作為一種語言結構,意味著它的執(zhí)行不需要函數(shù)查找和字母小寫化。也就是說,實際上在檢驗字符串長度的頂層代碼中你沒有花太多開銷。
舉例如下:
if (strlen($foo) < 5) { echo "Foo is too short"$$ }
if (!isset($foo{5})) { echo "Foo is too short"$$ }
調用isset()比strlen()快。
導讀: php isset和empty、==(等)和===(恒等)的區(qū)別
知識擴展
PHP String 函數(shù)
String 字符串函數(shù)允許您對字符串進行操作。
String 函數(shù)是 PHP 核心的組成部分。無需安裝即可使用這些函數(shù)。
函數(shù) | 描述 | PHP版本 |
---|---|---|
addcslashes() | 在指定的字符前添加反斜杠。 | 4 |
addslashes() | 在指定的預定義字符前添加反斜杠。 | 3 |
bin2hex() | 把 ASCII 字符的字符串轉換為十六進制值。 | 3 |
chop() | rtrim() 的別名。 | 3 |
chr() | 從指定的 ASCII 值返回字符。 | 3 |
chunk_split() | 把字符串分割為一連串更小的部分。 | 3 |
convert_cyr_string() | 把字符由一種 Cyrillic 字符轉換成另一種。 | 3 |
convert_uudecode() | 對 uuencode 編碼的字符串進行解碼。 | 5 |
convert_uuencode() | 使用 uuencode 算法對字符串進行編碼。 | 5 |
count_chars() | 返回字符串所用字符的信息。 | 4 |
crc32() | 計算一個字符串的 32-bit CRC。 | 4 |
crypt() | 單向的字符串加密法 (hashing)。 | 3 |
echo() | 輸出字符串。 | 3 |
explode() | 把字符串打散為數(shù)組。 | 3 |
fprintf() | 把格式化的字符串寫到指定的輸出流。 | 5 |
get_html_translation_table() | 返回翻譯表。 | 4 |
hebrev() | 把希伯來文本從右至左的流轉換為左至右的流。 | 3 |
hebrevc() | 同上,同時把(\n) 轉為 <br />。 | 3 |
html_entity_decode() | 把 HTML 實體轉換為字符。 | 4 |
htmlentities() | 把字符轉換為 HTML 實體。 | 3 |
htmlspecialchars_decode() | 把一些預定義的 HTML 實體轉換為字符。 | 5 |
htmlspecialchars() | 把一些預定義的字符轉換為 HTML 實體。 | 3 |
implode() | 把數(shù)組元素組合為一個字符串。 | 3 |
join() | implode() 的別名。 | 3 |
levenshtein() | 返回兩個字符串之間的 Levenshtein 距離。 | 3 |
localeconv() | 返回包含本地數(shù)字及貨幣信息格式的數(shù)組。 | 4 |
ltrim() | 從字符串左側刪除空格或其他預定義字符。 | 3 |
md5() | 計算字符串的 MD5 散列。 | 3 |
md5_file() | 計算文件的 MD5 散列。 | 4 |
metaphone() | 計算字符串的 metaphone 鍵。 | 4 |
money_format() | 把字符串格式化為貨幣字符串。 | 4 |
nl_langinfo() | 返回指定的本地信息。 | 4 |
nl2br() | 在字符串中的每個新行之前插入 HTML 換行符。 | 3 |
number_format() | 通過千位分組來格式化數(shù)字。 | 3 |
ord() | 返回字符串第一個字符的 ASCII 值。 | 3 |
parse_str() | 把查詢字符串解析到變量中。 | 3 |
print() | 輸出一個或多個字符串。 | 3 |
printf() | 輸出格式化的字符串。 | 3 |
quoted_printable_decode() | 解碼 quoted-printable 字符串。 | 3 |
quotemeta() | 在字符串中某些預定義的字符前添加反斜杠。 | 3 |
rtrim() | 從字符串的末端開始刪除空白字符或其他預定義字符。 | 3 |
setlocale() | 設置地區(qū)信息(地域信息)。 | 3 |
sha1() | 計算字符串的 SHA-1 散列。 | 4 |
sha1_file() | 計算文件的 SHA-1 散列。 | 4 |
similar_text() | 計算兩個字符串的匹配字符的數(shù)目。 | 3 |
soundex() | 計算字符串的 soundex 鍵。 | 3 |
sprintf() | 把格式化的字符串寫寫入一個變量中。 | 3 |
sscanf() | 根據指定的格式解析來自一個字符串的輸入。 | 4 |
str_ireplace() | 替換字符串中的一些字符。(對大小寫不敏感) | 5 |
str_pad() | 把字符串填充為新的長度。 | 4 |
str_repeat() | 把字符串重復指定的次數(shù)。 | 4 |
str_replace() | 替換字符串中的一些字符。(對大小寫敏感) | 3 |
str_rot13() | 對字符串執(zhí)行 ROT13 編碼。 | 4 |
str_shuffle() | 隨機地打亂字符串中的所有字符。 | 4 |
str_split() | 把字符串分割到數(shù)組中。 | 5 |
str_word_count() | 計算字符串中的單詞數(shù)。 | 4 |
strcasecmp() | 比較兩個字符串。(對大小寫不敏感) | 3 |
strchr() | 搜索字符串在另一字符串中的第一次出現(xiàn)。strstr() 的別名 | 3 |
strcmp() | 比較兩個字符串。(對大小寫敏感) | 3 |
strcoll() | 比較兩個字符串(根據本地設置)。 | 4 |
strcspn() | 返回在找到任何指定的字符之前,在字符串查找的字符數(shù)。 | 3 |
strip_tags() | 剝去 HTML、XML 以及 PHP 的標簽。 | 3 |
stripcslashes() | 刪除由 addcslashes() 函數(shù)添加的反斜杠。 | 4 |
stripslashes() | 刪除由 addslashes() 函數(shù)添加的反斜杠。 | 3 |
stripos() | 返回字符串在另一字符串中第一次出現(xiàn)的位置(大小寫不敏感) | 5 |
stristr() | 查找字符串在另一字符串中第一次出現(xiàn)的位置(大小寫不敏感) | 3 |
strlen() | 返回字符串的長度。 | 3 |
strnatcasecmp() | 使用一種“自然”算法來比較兩個字符串(對大小寫不敏感) | 4 |
strnatcmp() | 使用一種“自然”算法來比較兩個字符串(對大小寫敏感) | 4 |
strncasecmp() | 前 n 個字符的字符串比較(對大小寫不敏感)。 | 4 |
strncmp() | 前 n 個字符的字符串比較(對大小寫敏感)。 | 4 |
strpbrk() | 在字符串中搜索指定字符中的任意一個。 | 5 |
strpos() | 返回字符串在另一字符串中首次出現(xiàn)的位置(對大小寫敏感) | 3 |
strrchr() | 查找字符串在另一個字符串中最后一次出現(xiàn)的位置。 | 3 |
strrev() | 反轉字符串。 | 3 |
strripos() | 查找字符串在另一字符串中最后出現(xiàn)的位置(對大小寫不敏感) | 5 |
strrpos() | 查找字符串在另一字符串中最后出現(xiàn)的位置(對大小寫敏感) | 3 |
strspn() | 返回在字符串中包含的特定字符的數(shù)目。 | 3 |
strstr() | 搜索字符串在另一字符串中的首次出現(xiàn)(對大小寫敏感) | 3 |
strtok() | 把字符串分割為更小的字符串。 | 3 |
strtolower() | 把字符串轉換為小寫。 | 3 |
strtoupper() | 把字符串轉換為大寫。 | 3 |
strtr() | 轉換字符串中特定的字符。 | 3 |
substr() | 返回字符串的一部分。 | 3 |
substr_compare() | 從指定的開始長度比較兩個字符串。 | 5 |
substr_count() | 計算子串在字符串中出現(xiàn)的次數(shù)。 | 4 |
substr_replace() | 把字符串的一部分替換為另一個字符串。 | 4 |
trim() | 從字符串的兩端刪除空白字符和其他預定義字符。 | 3 |
ucfirst() | 把字符串中的首字符轉換為大寫。 | 3 |
ucwords() | 把字符串中每個單詞的首字符轉換為大寫。 | 3 |
vfprintf() | 把格式化的字符串寫到指定的輸出流。 | 5 |
vprintf() | 輸出格式化的字符串。 | 4 |
vsprintf() | 把格式化字符串寫入變量中。 | 4 |
wordwrap() | 按照指定長度對字符串進行折行處理。 | 4 |