導航:首頁 > 編程語言 > php統計字元串個數

php統計字元串個數

發布時間:2023-03-02 02:32:57

php如何獲取字元串長度,中文、符號、英文字母都算作一個

一般情況下 有漢字的時候 是使用 mb_strlen 這個函數來計算字元長度
這個函數需要開啟 mb_string擴展 默認都是不開啟的

Ⅱ php哪個函數能取得字元串長度

PHP對中文字元串的處理一直困擾於剛剛接觸PHP開發的新手程序員。下面簡要的剖析一下PHP對中文字元串長度的處理:
PHP自帶的函數如strlen()、mb_strlen()都是通過計算字元串所佔位元組數來統計字元串長度的,一個英文字元佔1位元組。

Ⅲ 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 如何僅計算字元串中的多個數字

可以按照如下方式實現:

<?php

function getNewStr($str) {

$newStr = '';

$a = '';

$b = '';

$flag = '';

for($i = 0; $i < strlen($str); $i++) {

// 如果是數字

if(preg_match("/^d*$/",$str[$i])) {

if ($flag == 'a' || $flag == '') {

$a = $a.$str[$i];

} else {

$b = $b.$str[$i];

}

} else {

$newStr = $newStr.$str[$i];

if ($flag == '') {

$flag = 'a';

$newStr = $newStr.'%d';

} else if ($flag == 'a') {

$flag = 'b';

$newStr = $newStr.'%d';

}

}

}

$newStr = sprintf($newStr, (int)$a*2, (int)$b*2);


return $newStr;

}


echo getNewStr('A15B25');

>?

代碼圖

用心回答,如果覺得有用請採納並點個關注,感謝。

Ⅳ php怎麼在一個字元串中統計數量

能表述清楚點嘛?
統計數量簡單得很啊,如果一個空格表示一個單詞的分割。第一步:用空格分割字元串並賦值給數組。
第二步:去掉數組中的空值和無效值。
第三步:統計數組大小。
如果不嚴謹的統計,第二步可以省略。

Ⅵ smarty怎麼用php函數把字元串轉成數組後在計算數組個數

以下是對php中的數組與字元串的轉換函數進行了詳細的整理匯總,需要的朋友可以參考下

1.將一個字元串轉化為數組
str_split()用於將一個字元串轉化為數組
語法:

復制代碼
代碼如下:

str_split(string,length)
<SPAN
style="COLOR: #333333"><SPAN style="FONT-SIZE: 12px"><SPAN
style="FONT-FAMILY:
宋體">//</SPAN></SPAN></SPAN>string是必須的,是要分割的字元串;<SPAN
style="FONT-SIZE: 12px"><SPAN style="FONT-FAMILY: 宋體; COLOR:
#333333"><SPAN style="LINE-HEIGHT:
28px">
//length是可選的,規定每個數組元素的長度
</SPAN></SPAN></SPAN>

tips:
如果 length 小於 1,str_split() 函數將返回
false。
如果 length 大於字元串的長度,整個字元串將作為數組的唯一元素返回。
例子:

復制代碼
代碼如下:

<?php
$str="www..com";
print_r(str_split($str));
?>

Ⅶ php如何獲取中文字元長度,一個中文字元算一個

在PHP中專門的mb_substr和mb_strlen函數,可以對中文進行截取和計算長度,但是,由於這些函數並非PHP的核心函數,所以,它們常常有可能沒有開啟。要在php.ini中開啟即可。獲取長度實例:1 ,utf-8環境下使用

header('Content-type:text/html;charset=utf-8');
/**
*可以統計中文字元串長度的函數
*@param$str要計算長度的字元串
*@param$type計算長度類型,0(默認)表示一個中文算一個字元,1表示一個中文算兩個字元
*
*/
functionabslength($str)
{
if(empty($str)){
return0;
}
if(function_exists('mb_strlen')){
returnmb_strlen($str,'utf-8');
}
else{
preg_match_all("/./u",$str,$ar);
returncount($ar[0]);
}
}
$str='我們都是中國人啊,ye!';
$len=abslength($str);
var_mp($len);//return12
$len=abslength($str,'1');
echo'<br/>'.$len;//return22

/*
utf-8編碼下截取中文字元串,參數可以參照substr函數
@param$str要進行截取的字元串
@param$start要進行截取的開始位置,負數為反向截取
@param$end要進行截取的長度
*/
functionutf8_substr($str,$start=0){
if(empty($str)){
returnfalse;
}
if(function_exists('mb_substr')){
if(func_num_args()>=3){
$end=func_get_arg(2);
returnmb_substr($str,$start,$end,'utf-8');
}
else{
mb_internal_encoding("UTF-8");
returnmb_substr($str,$start);
}

}
else{
$null="";
preg_match_all("/./u",$str,$ar);
if(func_num_args()>=3){
$end=func_get_arg(2);
returnjoin($null,array_slice($ar[0],$start,$end));
}
else{
returnjoin($null,array_slice($ar[0],$start));
}
}
}
$str2='wo要截取zhongwen';
echo'<br/>';
echoutf8_substr($str2,0,-4);//returnwo要截取zhon

2,支持gb2312,gbk,utf-8,big5 中文截取方法

/*

* 中文截取,支持gb2312,gbk,utf-8,big5

*

* @param string $str 要截取的字串

* @param int $start 截取起始位置

* @param int $length 截取長度

* @param string $charset utf-8|gb2312|gbk|big5 編碼

* @param $suffix 是否加尾綴

*/

public function csubstr($str, $start=0, $length, $charset="utf-8", $suffix=true)

{

if(function_exists("mb_substr"))

{

if(mb_strlen($str, $charset) <= $length) return $str;

$slice = mb_substr($str, $start, $length, $charset);

}

else

{

$re['utf-8'] = "/[x01-x7f]|[xc2-xdf][x80-xbf]|[xe0-xef][x80-xbf]{2}|[xf0-xff][x80-xbf]{3}/";

$re['gb2312'] = "/[x01-x7f]|[xb0-xf7][xa0-xfe]/";

$re['gbk'] = "/[x01-x7f]|[x81-xfe][x40-xfe]/";

$re['big5'] = "/[x01-x7f]|[x81-xfe]([x40-x7e]|xa1-xfe])/";

preg_match_all($re[$charset], $str, $match);

if(count($match[0]) <= $length) return $str;

$slice = join("",array_slice($match[0], $start, $length));

}

if($suffix) return $slice."…";

return $slice;

}

閱讀全文

與php統計字元串個數相關的資料

熱點內容
增量方式編程 瀏覽:228
單片機反接為啥會燒壞 瀏覽:944
河北網路伺服器雲伺服器 瀏覽:352
編程序員年薪百萬 瀏覽:998
網通的寬頻玩電信伺服器地址 瀏覽:828
解壓視頻搞笑大全爆笑 瀏覽:614
米兔解壓積木隱藏款金屬 瀏覽:574
window命令行svn 瀏覽:616
8051單片機包含多大的ram 瀏覽:812
man文件linux 瀏覽:283
javaweb實現頁面跳轉 瀏覽:126
命令如什麼 瀏覽:316
centos如何使用ftp伺服器 瀏覽:982
直立車陀螺儀演算法 瀏覽:70
coreldrawpdf下載 瀏覽:896
虛擬主機雲伺服器軟體服務 瀏覽:373
蘋果的怎麼拉安卓的打游戲 瀏覽:415
游戲程序員負責角色 瀏覽:316
於丹pdf 瀏覽:718
反編譯ref 瀏覽:551