• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

浅谈PHP源码十五:关于array_walk函数

php 搞代码 3年前 (2022-01-22) 24次浏览 已收录 0个评论

这篇文章主要介绍了关于浅谈PHP源码十五:关于array_walk函数 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

浅谈PHP源码十五:关于array_walk函数

array_walk

(PHP 3 >= 3.0.3, PHP 4, PHP 5)
array_walk — 对数组中的每个成员应用用户函数
说明

bool array_walk ( array &array, callback funcname [, mixed userdata] )

如果成功则返回 TRUE,失败则返回 FALSE。
将用户自定义函数 funcname 应用到 array 数组中的每个单元。典型情况下 funcname 接受两个参数。array 参数的值作为第一个,键名作为第二个。如果提供了可选参数 userdata,将被作为第三个参数传递给 callback funcname。
如果 funcname/本文来源gao@!dai!ma.com搞$$代^@码5网@搞代gaodaima码 函数需要的参数比给出的多,则每次 array_walk() 调用 funcname 时都会产生一个 E_WARNING 级的错误。这些警告可以通过在 array_walk() 调用前加上 PHP 的错误操作符 @ 来抑制,或者用 error_reporting()。
注意: 如果 funcname 需要直接作用于数组中的值,则给 funcname 的第一个参数指定为引用。这样任何对这些单元的 改变也将会改变原始数组本身。
注意: 将键名和 userdata 传递到 funcname 中是 PHP 4.0 新增加的。

array_walk() 不会受到 array 内部数组指针的影响。array_walk() 会遍历整个数组而不管指针的位置。(这是由于程序在数组遍历开始时就重置了数组所在hash table的指针)
用户不应在回调函数中改变该数组本身。例如增加/删除单元,unset 单元等等。如果 array_walk() 作用的数组改变了,则此函数的的行为未经定义,且不可预期。
程序实现说明:
扩展最后调用的是函数php_array_walk:

   static int php_array_walk(HashTable *target_hash, zval **userdata, int recursive TSRMLS_DC)

当recursive == 0时,此函数为array_walk函数实现

当recursive == 1时,此函数为array_walk_recursive函数的实现

源码中,程序会遍历整个数组,并针对每个数组元素,根据传入的函数,作相关的函数调用
函数的调用如下:

fci.size = sizeof(fci);            fci.function_table = EG(function_table);            fci.function_name = *BG(array_walk_func_name);            fci.symbol_table = NULL;            fci.object_pp = NULL;            fci.retval_ptr_ptr = &retval_ptr;            fci.param_count = userdata ? 3 : 2;            fci.params = args;            fci.no_separation = 0;             /* Call the userland function */            if (zend_call_function(&fci, &array_walk_fci_cache TSRMLS_CC) == SUCCESS) {

在此函数调用中有使用到一个结构体,个人添加的注释如下:

 typedef struct _zend_fcall_info { size_t size;    //    整个结构体的长度,等于sizeof(此函数体的变量) HashTable *function_table;    //    executor_globals.function_table zval *function_name;    //    函数名  HashTable *symbol_table; zval **retval_ptr_ptr;        //    函数的返回值 zend_uint param_count;    //    参数个数 zval ***params;            //    所调用函数的参数 zval **object_pp;        //    用于对象的方法调用时,存储对象 zend_bool no_separation;    //    是否清空参数所在的栈} zend_fcall_info;

以上为个人所注,如有错,请指正!

EOF

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请随时关注我们网站!

相关推荐:

浅谈PHP源码十四: 关于array_combine函数

浅谈PHP源码十三:关于array_change_key_case,array_chunk的介绍

浅谈PHP源码十二:关于return_value 返回值

以上就是浅谈PHP源码十五:关于array_walk函数的详细内容,更多请关注搞代码gaodaima其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:浅谈PHP源码十五:关于array_walk函数

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址