當前位置:首頁 » 編程語言 » phpstrlen

phpstrlen

發布時間: 2023-01-12 05:23:25

『壹』 php里這個strlen()-1減一是什麼意思

是因為php的字元串變數的索引是從0開始的,所以最大長度減1就是實際長度,不減1就會發生數組越界

『貳』 php strlen utf8一個中文算3個位元組嗎

utf8是變長編碼, 不一定是3位元組, 可能是2~3, 當然ASCII字元還是1位元組.gbk也是變長編碼, 非ASCII的2位元組, ASCII還是1位元組.這兩個編碼對於非ASCII字元, 都是多位元組的, 並且多位元組字元每個位元組都是>127的, 也就是負數(最高位是1).另外, PHP里的strlen不是依靠判斷字元串結尾的, 因為PHP是腳本語言, 它的字元串和C++的string是一樣的, 將存儲的位元組個數當作字元串長度.另外, PHP里想數數有多少個位元組用strlen, 想數數有多少個字元, 用mb系列函數, 自己去了解一下.還有些需求, 比如字元串匹配查找之類的, gbk是存在雙位元組匹配問題的, 兩個連續漢字的中間2個位元組可能被誤認為其他字元, 所以不能用strstr之類的位元組匹配函數(PHP里是純位元組匹配的, 不關心), 但utf-8是可以的, 它不會有類似的沖突, 另外最好的做法當然還是用mb系列, 安全可靠, 而且還支持猜編碼功能.

『叄』 php的strlen問題,為什麼相同的一句話,輸出結果不同呢

編碼問題。
UTF8編碼中,中文為3位元組,也就是一個中文字佔用3個位元組。
GB編碼中,中文為2位元組。
你可以數一下(那個冒號應該是英文字元,佔1位元組),31的那個是UTF8編碼,26的是GB編碼

並且中文有5個字,兩個差距正好差了5個位元組。

『肆』 PHP的strlen函數

返回字元串的長度。
計算字元串長度可以用於條件判斷,例如限制某個變數值的長度。

strlen函數屬於string字元串函數。

計算成功返回字元串長度,如果字元串為空返回0。

運行結果:

在 PHP 5.3.0 之前,該函數把數組當做字元串 Array,這樣就返回一個長度為 5 的字元串,並產生一個 E_NOTICE 級別的錯誤。

在count函數的「應用經驗」里提到的對$_GET做限制的應用,在編寫SteelEC的miniblog功能時也用到strlen函數做限制「錨」字元串長度。

w3school:PHP strlen()函數

count:返回數組中的元素數量。

『伍』 php中strlen什麼意思

strlen獲取變數的長度,判斷是否等於2,這里有幾個問題,比如如果$i是中文的話結果可能有問題,使用mb_strlen避免錯誤。

『陸』 為什麼PHP中會出現strlen函數未定義的致命錯誤

(strlen($_POST['year']==4)這句當為空時,裡面參數就會是空,從而導致函數失效
Warning: Wrong parameter count for strlen() in C:\AppServ\www\wocs.php on line 2

『柒』 php哪個函數能取得字元串長度

1、首先新建一個php文件,命名為test.php。

『捌』 PHP字元串長度計算 - strlen()函數使用介紹

strlen()函數和mb_strlen()函數
在PHP中,函數strlen()返回字元串的長度。函數原型如下:
復制代碼
代碼如下:
int
strlen(string
string_input);
參數string_input為要處理的字元串。
strlen()函數返回字元串所佔的位元組長度,一個英文字母、數字、各種符號均佔一個位元組,它們的長度均為1。一個中午字元占兩個位元組,所以一個中午字元的長度是2。例如
復制代碼
代碼如下:
<?php
echo
strlen("www.sunchis.com");
echo
strlen("三知開發網");
?>
「echo
strlen("www.sunchis.com");」的運行結果:15
「echo
strlen("三知開發網");」的運行結果:15
這里有一個疑問,一個中文字元不是佔2個位元組嗎?「三知開發網」,明明是五個漢字,運行的結果怎麼會是15?
原因出在這里:strlen()計算時,對於一個UTF-8的中文字元,會把它當做長度為3來處理。當出現中英文混排的情況下,怎麼准確的計算字元串的長度呢?這里,得引入另外一個函數mb_strlen()。mb_strlen()函數的用法與strlen()幾乎一摸一樣,只是多了一個指定字元集編碼的參數。函數原型為:
復制代碼
代碼如下:
int
mb_strlen(string
string_input,
string
encode);
PHP內置的字元串長度函數strlen無法正確處理中文字元串,它得到的只是字元串所佔的位元組數。對於GB2312的中文編碼,strlen得到的值是漢字個數的2倍,而對於UTF-8編碼的中文,就是3倍的差異了(在UTF-8編碼下,一個漢字佔3個位元組)。
因此,下面的代碼能准確計算出中文字元串的長度:
復制代碼
代碼如下:
<?php
$str
=
"三知sunchis開發網";
echo
strlen($str)."<br>";
//結果:22
echo
mb_strlen($str,"UTF8")."<br>";
//結果:12
$strlen
=
(strlen($str)+mb_strlen($str,"UTF8"))/2;
echo
$strlen;
//結果:17
?>
原理分析:
strlen()計算時,對待UTF-8的中文字元長度是3,所以「三知sunchis開發網」的長度為5×3+7×1=22
在mb_strlen計算時,選定內碼為UTF8,則會將一個中文字元當作長度1來計算,所以「三知sunchis開發網」長度為5×1+7×1=12
剩下的就是純數學問題了,在此就不啰嗦了……
注意:對於mb_strlen($str,'UTF-8'),如果省略第二個參數,則會使用PHP的內部編碼。內部編碼可以通過mb_internal_encoding()函數得到。需要注意的是,mb_strlen並不是PHP核心函數,使用前需要確保在php.ini中載入了php_mbstring.dll,即確保「extension=php_mbstring.dll」這一行存在並且沒有被注釋掉,否則會出現未定義函數的問題。

『玖』 PHP的count(數組)和strlen(字元串)的內部實現。

翻了下PHP內核的定義,大概心中也有了答案了

count()和strlen()都是O(1)的時間復雜度

試想一下如果strlen()需要O(N)的復雜度那未免也太慢了,字元串長度起來的話伺服器不是要直接掛掉嗎

這兩個函數都是典型的空間換時間的做法

我們可以先看看zvalue的結構:

typedefunion_zvalue_value{
longlval;/*longvalue*/
doubledval;/*doublevalue*/
struct{
char*val;
intlen;
}str;
HashTable*ht;/*hashtablevalue*/
zend_object_valueobj;
zend_ast*ast;
}zvalue_value;

這里用的是一個聯合體,當變數類型是string類型的時候附加存儲多了一個len的整型變數,顯而易見需要取長度直接利用記錄值就可以了,自然就是O(1)

對於count()常用的參數類型應該為數組,對於繼承Countable的類暫不作討論

數組實現方式為Hashtable,直接看看他的結構吧

typedefstruct_hashtable{
uintnTableSize;//hashBucket的大小,最小為8,以2x增長。
uintnTableMask;//nTableSize-1,索引取值的優化
uintnNumOfElements;//hashBucket中當前存在的元素個數,count()函數會直接返回此值
ulongnNextFreeElement;//下一個數字索引的位置
Bucket*pInternalPointer;//當前遍歷的指針(foreach比for快的原因之一)
Bucket*pListHead;//存儲數組頭元素指針
Bucket*pListTail;//存儲數組尾元素指針
Bucket**arBuckets;//存儲hash數組
dtor_func_tpDestructor;//在刪除元素時執行的回調函數,用於資源的釋放
zend_boolpersistent;//指出了Bucket內存分配的方式。如果persisient為TRUE,則使用操作系統本身的內存分配函數為Bucket分配內存,否則使用PHP的內存分配函數。
unsignedcharnApplyCount;//標記當前hashBucket被遞歸訪問的次數(防止多次遞歸)
zend_boolbApplyProtection;//標記當前hash桶允許不允許多次訪問,不允許時,最多隻能遞歸3次
#ifZEND_DEBUG
intinconsistent;
#endif
}HashTable;

count直接獲取nNumOfElements大小,所以也是O(1)

補充------------------------------------------------

count() 函數的定義在這里

/*{{{protointcount(mixedvar[,intmode])
(usuallyanarray)*/
PHP_FUNCTION(count)
{
zval*array;
zend_longmode=COUNT_NORMAL;
zend_longcnt;
zval*element;

ZEND_PARSE_PARAMETERS_START(1,2)
Z_PARAM_ZVAL(array)
Z_PARAM_OPTIONAL
Z_PARAM_LONG(mode)
ZEND_PARSE_PARAMETERS_END();

switch(Z_TYPE_P(array)){
caseIS_NULL:
php_error_docref(NULL,E_WARNING,"");
RETURN_LONG(0);
break;
caseIS_ARRAY:
if(mode!=COUNT_RECURSIVE){
//類型為數組時調用zend內核函數zend_array_count()
cnt=zend_array_count(Z_ARRVAL_P(array));
}else{
cnt=php_count_recursive(Z_ARRVAL_P(array));
}
RETURN_LONG(cnt);
break;
caseIS_OBJECT:{
zvalretval;
/*first,wecheckifthehandlerisdefined*/
if(Z_OBJ_HT_P(array)->count_elements){
RETVAL_LONG(1);
if(SUCCESS==Z_OBJ_HT(*array)->count_elements(array,&Z_LVAL_P(return_value))){
return;
}
}
/*()method*/
if(instanceof_function(Z_OBJCE_P(array),zend_ce_countable)){
zend_call_method_with_0_params(array,NULL,NULL,"count",&retval);
if(Z_TYPE(retval)!=IS_UNDEF){
RETVAL_LONG(zval_get_long(&retval));
zval_ptr_dtor(&retval);
}
return;
}

/*IfThere'snohandleranditdoesn'*/
php_error_docref(NULL,E_WARNING,"");
RETURN_LONG(1);
break;
}
default:
php_error_docref(NULL,E_WARNING,"");
RETURN_LONG(1);
break;
}
}

如果沒有特別指定mode參數為 COUNT_RECURSIVE 的話(即作遍歷),跳轉到 zend 的數組計數函數 zend_array_count()

#definezend_hash_num_elements(ht)
(ht)->nNumOfElements

...
...

staticuint32_tzend_array_recalc_elements(HashTable*ht)
{
zval*val;
uint32_tnum=ht->nNumOfElements;

ZEND_HASH_FOREACH_VAL(ht,val){
if(Z_TYPE_P(val)==IS_INDIRECT){
if(UNEXPECTED(Z_TYPE_P(Z_INDIRECT_P(val))==IS_UNDEF)){
num--;
}
}
}ZEND_HASH_FOREACH_END();
returnnum;
}

ZEND_APIuint32_tzend_array_count(HashTable*ht)
{
uint32_tnum;
if(UNEXPECTED(ht->u.v.flags&HASH_FLAG_HAS_EMPTY_IND)){
num=zend_array_recalc_elements(ht);
if(UNEXPECTED(ht->nNumOfElements==num)){
ht->u.v.flags&=~HASH_FLAG_HAS_EMPTY_IND;
}
}elseif(UNEXPECTED(ht==&EG(symbol_table))){
num=zend_array_recalc_elements(ht);
}else{
num=zend_hash_num_elements(ht);
}
returnnum;
}

IS_REFERENCE:間接 zval 指的就是其真正的值是存儲在其他地方的。注意這個IS_REFERENCE類型是不同的,間接 zval 是直接指向另外一個 zval 而不是像zend_reference結構體一樣嵌入 zval。

只有當數組中有HASH_FLAG_HAS_EMPTY_IND 這個 flag 時(間接zval)才會對數組進行遍歷校驗,其他情況下都是直接取 數組(hash table) 裡面的 nNumOfElements 的值,答案顯而易見了,就是O(1)

『拾』 php 中的mb_strlen 與 strlen 哪個跟javascript 中的length 相同,如果不同應該怎麼改的相同

額~ 如果是字元串長度的話 mb_strlen 和 Js 的 length 相同。
strlen是字元串長度,但是其實可以說是位元組長度,因為PHP還不支持unicode,所以對於多位元組字元沒法通過strlen正確的取得長度。如果編碼是gbk的話,一個漢字的長度是2, 如果是utf-8的話,一個漢字的長度一般是3,也可能不是,這個按照編碼區間來區分。
如果要出里多位元組字元字元串的話,就要用PHP 的一個 mb 擴展,mb族包含了一系列函數,可以去PHP 手冊看http://www.php.net/manual-lookup.php?pattern=mb&lang=en&scope=quickref

我也表達不是很明白。建議你網路或者google 一下 Unicode、ASCII、UTF-8、GBK~ 都看一下,就很明白了。PHP和JS支持的編碼不一樣,所以很多不一樣。
有問題可以Hi我。

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:585
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:881
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:574
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:761
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:677
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1005
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:250
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:108
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:799
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:705