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秒,你可以接受,让你等五秒,你估计炸毛了。。。

打赏

5bcf1d675d3d892e4e904daf057a4823.png微信扫一扫,打赏作者吧~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/561527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jsp源码oracle数据库,JSP与oracle数据库交互案例

本案例为咖啡销售情况录入查询系统一、数据输入系统:1. 设计输入信息页面代码如下:咖啡管理系统——录入系统欢迎来到录入系统vcm0gYWN0aW9uPQ"inputaction.jsp" method"post" name"form1" id"form1">咖啡名…

崔华 oracle简历,2013数据库大会:崔华-基于Oracle的SQL优化案例分析

2013数据库大会:崔华-基于Oracle的SQL优化案例分析崔华的新书即将出版,其数据库大会上的演讲也非常精彩,他的新书十分值得期待。2013年中国数据库技术大会第二天的"Oracle架构与优化"专场中,来自中航信资深Oracle数据库工程师崔华为…

模板消息 php实例,PHP微信模板消息操作示例

本文实例讲述了PHP微信模板消息操作方法。分享给大家供大家参考,具体如下:微信SDK:class Oauth {//获得全局access_tokenpublic function get_token(){//如果已经存在直接返回access_token//if($_SESSION[access_token] && $_SESSION…

linux设置静态ip后端口不能上网,Centos7设置静态IP后无法上网的解决方法

在VMWare中安装的本地虚拟机CentOS7操作系统,动态IP地址会经常变化,设置成静态IP地址后,本地局域网可以互相访问,但CentOS7系统无法访问互联网,按以下步骤解决这个问题。1、以系统管理员打开VMWare2、选择虚拟网络编辑…

深度Linux修改分辨率6,Deepin 修改自定义分辨率

之前我有篇文章是写显示器超频问题,当时感觉Deepin超频麻烦,折腾换成了Win10,但用了断时间后,感觉Win10真的不好用,夜览模式软件适配差,CPU占用率高,字体颗粒感强,显示器看着眼睛很累…

linux下如何bash文件,Linux系统的文件管理命令及bash的相关工作特性

一、Linux系统的文件管理命令:1 \pwd:printing working directory2 \cd:change directory cd [/PATH/TO/SOMEDIR/]可带可不带,切换回家目录;注意:bash中~表示家目录;cd ~:切换回自己的家目录&#xff…

2019浙江C语言二级答案,2019年下半年二级C语言试题及答案

机遇总是有的,如果把握不住,不要怨天忧人,原因只是自己不够优秀;不要把时间当垃圾处理,唯有珍惜光阴、努力刷二级C语言试题,才能提升生命的质量。1)若有以下语句:typedef struct S{ int g;char …

win10定时关机c语言,win10定时关机在哪?win10设置定时关机的三种方法

win10定时关机在哪?很多win10用户可能还不会设置定时关机,下面脚本之家小编就给大家带来win10设置定时关机的三种方法,一起来看看吧!方法一:Win10定时关机命令:shutdown –s –t 3600后面的3600代表秒&…

android编译日志在哪,Android编译环境中的JDK存放位置

this.p{ m:2,b:2,loftPermalink:,id:fks_081066082085084067092086081095080081089075087087,blogTitle:Android编译环境中的JDK存放位置,blogAbstract:因为Ubuntu 10.04已经不带有SUN JDK,所以这个需要到sun网站上下载,并手动安装。所以,这个…

华为鸿蒙系统HarmonyOS手机,华为鸿蒙系统2.0适配哪些机型

华为鸿蒙系统2.0适配机型大部分都是华为手机,那么都有哪些手机适合这个系统呢,用户想要使用鸿蒙系统应该在哪去申请呢,别着急下面我们一起了解吧。华为鸿蒙系统2.0适用机型推荐HarmonyOS 2.0手机开发者Beta公测招募入口:点击进入同…

webstorm 运行android,Windows React Native环境搭建:webstorm+android studio 及解决热更新

工具准备:SDKAndroid SDK Build-tools:23.0.1SDK Platform:Android N 、6.0 、5.1.1、5.0.1、4.4.2、4.1.2Android模拟器镜像:6.0、5.1和4.1python使用 python2nodejs使用官网最新即可更改源:npm config set registry …

华为鸿蒙系统使用视频,原生鸿蒙系统,华为WATCH 3上手视频曝光

华为即将在 6 月 2 日发布华为 WATCH 3,而真机图和上手视频已经出现在网络上。华为 WATCH 3 将出厂预装鸿蒙 HarmonyOS,圆形表盘 旋转表冠设计。爆料图和视频都应该都出自华为的线下门店,爆料图展示了华为 WATCH 3 和华为 WATCH 3 Pro 的包装…

在html中怎么写加起来的,css可以在html里面写吗?

css可以在html里面写吗?答案是可以的。那么如何在HTML中写CSS?下面给大家介绍一下。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。下面我们来看一下在HTML中写css的方法:1、内部样式表--在head标签…

广东省2021高考2bi补录成绩查询,重磅!广东省2021年普通高考美术统考成绩1月8日起可查询!...

我省2021年普通高考美术、书法和广播电视编导术科统考工作已全面结束。现就美术、书法和广播电视编导术科统考成绩公布有关事项通知如下:一、成绩公布时间和方式1月8日10:00起,考生可通过省教育考试院官微(ID:gdsksy)小程序和广东教育考试服务…

主攻计算机专业英语翻译,湖师大“博导”黄振定,主攻“翻译学”

黄振定教授黄振定,男,1950年11月生,汉族,江西永新人。英语语言文学博士导师(翻译学、语言学方向),湖南师范大学外语学院和哲学系教授、硕士生导师。翻译系主任、翻译研究所所长。湖南省社科联五届委员会委员&#xff0…

计算机二级选择题考word基础知识吗,计算机二级ms office只考选择题吗?好考吗

满意答案liqiwt522014.09.20采纳率:46% 等级:8已帮助:4259人这个计算机二级MS office高级应用是今年新增加的科目,从今年(2013)9月份开始开考,知识点大体上包括计算机基础知识、word应用、excel应用和powerpoint应用…

html列表拖拽排序插件,JS拖拽排序插件Sortable.js用法实例分析

本文实例讲述了JS拖拽排序插件Sortable.js用法。分享给大家供大家参考,具体如下:最近由于项目功能设计的原因,需要对table中的行实现拖拽排序功能,找来找去发现Sortable.js能很好的满足这个需求,而且它还是开源的&…

信息学奥赛课课通VS中学生计算机,数学奥赛VS信息学奥赛 孩子们该如何选择

同是奥赛,为什么越来越多的孩子选了信息学?今年3月,教育部正式发布通知:全面取消中学奥赛等5项全国性高考加分项目。这个消息对很多有志于让孩子“走捷径”的家长而言,可谓晴空霹雳,升学道路上突然没了“加分”可怎么办&#xff…

阿尔伯塔大学2019计算机科学 cs,[阿尔伯塔大学]计算机/计算机工程专业

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼阿尔伯塔大学的的电子与计算机工程专业(ECE)一直以来在加拿大各顶尖学校中名列前茅,其拥有诸多先进的设施(高端前沿的实验室设备、专门的实习场地以及极具特色的6500平方英尺的纳米和微型加工设施等),国际知…

方正计算机软件保护进超级用户,超级用户权限补丁(SuperSU Pro)含刷机包

SuperSU权限管理是一款对已获取ROOT权限的Android手机进行第三方应用程序的权限管理的应用工具,神器作者最新作品,比Superuser功能更加强大,界面更加美观。注意:此软件需要手机已获取ROOT权限后才能正常运行!超级用户权…