日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php扩展返回字符数组,PHP扩展之数组字符串处理

發布時間:2025/3/12 php 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php扩展返回字符数组,PHP扩展之数组字符串处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天介紹一下PHP擴展來處理數組和字符串,附帶一個對比原生PHP的處理效率:

我的測試機是裝的PHP5.6.12,實現下面這個功能:function?phprandstr($a,?$z,?$n)?{

$b?=?array();

$max?=?count($a);

for?($i?=?0;?$i?

$tmp?=?"";

for?($j?=?0;?$j?

$zix?=?mt_rand(0,?($max?-?1));

$tmp.=$a[$zix];

}

array_push($b,?$tmp);

}

return?$b;

}

很簡單對不對,對一個數組里面的字符,隨機取出來拼接,然后push到一個新的數組,下面來看PHP擴展的實現:

繼續在我之前那個ligphp擴展里面寫,編輯php_ligphp.h,添加一個randStr()函數:PHP_FUNCTION(randStr);

然后我們來重點看一下ligphp.c里面的代碼:PHP_FUNCTION(randStr)?{

zval?*arr,?**data;

long?z;

long?n;

int?i,?j,?zix;

char?*s?=?NULL,?*str;

HashTable?*?arr_hb;

if?(zend_parse_parameters(ZEND_NUM_ARGS()?TSRMLS_CC,?"all",?&arr,?&z,?&n)?==?FAILURE)?{

RETURN_NULL();

}

arr_hb?=?Z_ARRVAL_P(arr);

long?length?=?zend_hash_num_elements(arr_hb);

if?(z?>?length)?{

php_error_docref(NULL?TSRMLS_CC,?E_NOTICE,?"參數二不能超過數組長度");

RETURN_NULL();

}

array_init_size(return_value,?n);

for?(i?=?0;i?

str?=?(char?*)malloc(z?+?1);

memset(str,?'\0',?z?+?1);

for(j?=?0;j?

zix?=?php_rand()?%?length;

if(zend_hash_index_find(arr_hb,?zix,?(void?**)&data)==?FAILURE)?{

return;

}

s?=?Z_STRVAL_PP(data);

strncat(str,?s,?strlen(s));

}

add_index_string(return_value,?i,?str,?1);

}

return;

};

解釋下上面的代碼;

1.我們首先用zend_parse_parameters()函數接收參數,可以看到,接收一個數組類型的zval結構arr,2個long整型z和n;

2.用Z_ARRVAL_P宏,取出arr的值賦給哈希表結構類型的arr_hb,用zend_hash_num_elements()函數獲取hashtable的長度便于下面的驗證和算法處理;

3.用array_init_size()函數初始化return_value為一個數組;

4.開始循環處理,這里代碼比較簡單,用到的2個C函數malloc()動態分配內存空間和memset()把str的內存地址中沒一個字節都設置成'\0'空字符串,即NULL;

5.zend_hash_index_find()函數是用于數字型索引數組的查找,strncat()是C函數用于拼接字符串的,add_index_string()函數類似PHP的array_push(),只不過是要指定index的。

把randStr注冊到函數表中然后編譯,接下來,我們來做一個簡單測試,從26個英文字母里面隨機取50000個10位的字符串,對比PHP執行和PHP擴展執行的效率:$a?=?array("a",?"b",?"c",?"d",?"e",?"f",?"g",?"h",?"i",?"j",?"k",?"l",?"m",?"n",?"o",?"p",?"q",?"r",?"s",?"t",?"u",?"v",?"w",?"x",?"y",?"z");

$t1?=?microtime(true);

//$b=phprandstr($a,10,50000);

$b?=?randStr($a,?10,?50000);

$t2?=?microtime(true);

echo?"耗時:"?.?($t2?-?$t1)?.?"\n";

在我的機器上實測PHP處理需要0.162毫秒,PHP擴展處理0.032毫秒,相差大概五倍,可能毫秒級的你不在乎,但是想想,一次請求讓你等1秒,你可以接受,讓你等五秒,你估計炸毛了。。。

打賞

微信掃一掃,打賞作者吧~

總結

以上是生活随笔為你收集整理的php扩展返回字符数组,PHP扩展之数组字符串处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。