一, php手册的解释:

call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的参数 

说明:

mixed  call_user_func_array  ( callable  $callback  , array $param_arr  )

把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入。

参数

callback   被调用的回调函数。 

param_arr  要被传入回调函数的数组,这个数组得是索引数组。 

返回值

返回回调函数的结果。如果出错的话就返回 FALSE 

array_walk — 使用用户自定义函数对数组中的每个元素做回调处理

说明

bool array_walk  ( array &$array  , callable  $funcname  [, mixed  $userdata  = NULL    ] )

将用户自定义函数 funcname 应用到 array 数组中的每个单元。 array_walk() 不会受到 array 内部数组指针的影响。

array_walk()  会遍历整个数组而不管指针的位置。 

参数

array 输入的数组。 

funcname  典型情况下 funcname 接受两个参数。array
参数的值作为第一个,键名作为第二个。

Note1: 

如果 funcname 需要直接作用于数组中的值,则给 funcname 的第一个参数指定为引用。这样任何对这些单元的改变也将会改变原始数组本身。 

Note2: 

Many internal functions (for example strtolower() ) will throw a warning if more than the expected number of argument are

passed in and are not usable directly as funcname. 

只有 array 的值才可以被改变,用户不应在回调函数中改变该数组本身的结构。例如增加/删除单元,unset 单元等等。如果 array_walk()  

作用的数组改变了,则此函数的的行为未经定义,且不可预期。 

userdata 

如果提供了可选参数 userdata,将被作为第三个参数传递给 callback funcname。 

返回值

成功时返回 TRUE , 或者在失败时返回 FALSE 。

二,实例

array_walk()函数应用实例:

$fruits  = array( "d"  =>  "lemon" ,  "a"  =>  "orange" ,  "b"  =>  "banana" ,  "c"  =>  "apple" );

 function  test_alter (& $item1 ,  $key ,  $prefix )

{

   $item1  =  " $prefix :  $item1 " ;

 }

 function  test_print ( $item2 ,  $key )

{

   echo  " $key .  $item2 <br />\n" ;

 }

 echo  "Before ...:<br/>" ;

 array_walk ( $fruits ,  'test_print' );

 echo  "... and after:<br/>" ;

 array_walk ( $fruits ,  'test_alter' ,  'fruit' );

 array_walk ( $fruits ,  'test_print' );

call_user_func_array()函数应用实例:

1,在类中的使用:

function  foobar ( $arg ,  $arg2 )

{

    echo  __FUNCTION__ ,  " got  $arg  and  $arg2 \n" ;

}

class  foo  

{

    function  bar ( $arg ,  $arg2 )

   {

        echo  __METHOD__ ,  " got  $arg  and  $arg2 \n" ;

    }

}

 // Call the foobar() function with 2 arguments

 call_user_func_array ( "foobar" , array( "one" ,  "two" ));

 // Call the $foo->bar() method with 2 arguments

 $foo  = new  foo ;

 call_user_func_array (array( $foo ,  "bar" ), array( "three" ,  "four" ));

2,作为一个完整的函数的传入:

function fnCallBack( $msg1 , $msg2 )

{

    echo 'msg1:'.$msg1;

    echo "<br />\n";

    echo 'msg2:'.$msg2;

}

$fnName = "fnCallBack"; //方法名

$params = array( 'hello' , 'world' );//传给参数的值

call_user_func_array( $fnName , $params );

之所以写这些,是发现自己对这两个函数的概念和使用不是很清楚,因此重温一下。至于这两个函数的差别,个人感觉不是很大。

当遇到如下场景:要调用的函数名以及要调用函数的参数类型及个数也是未知的,因为未知,所以这个时候用call_user_func_array这样的函数。

array_walk函数与call_user_func_array函数的更多相关文章

  1. PHP 中 call_user_func 函数 和 call_user_func_array 函数的区别

    PHP 中 call_user_func() 函数 和 call_user_func_array() 函数都是回调函数,在写接口的时候经常会用到,但是他们有什么区别呢? 它们的第一个参数都是被调用的回 ...

  2. PHP中的回调函数和匿名函数

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  3. php变量函数,回调函数

    一,变量可以直接传递函数 <?php function demo($num , $n )//$n是个函数 { for($i=0;$i<$num;++$i) { if($n($i)) { e ...

  4. PHP回调函数及匿名函数概念与用法详解

    1.回调函数 PHP的回调函数其实和C.Java等语言的回调函数的作用是一模一样的,都是在主线程执行的过程中,突然跳去执行设置的回调函数: 回调函数执行完毕之后,再回到主线程处理接下来的流程 而在ph ...

  5. PHP函数(五)-回调函数

    回调函数是指调用函数的时候将另一个函数作为参数传递到调用的函数中,而不是传递一个普通的变量作为参数 使用回调函数是为了可以将一段自己定义的功能传到函数内部使用 声明回调函数的方法 变量函数声明 < ...

  6. php匿名函数和闭包函数及use关键字传参及Closure匿名函数类

    php闭包函数用use传参有什么意义?答:use引用外层变量,比如全局变量 Closure,匿名函数,是php5.3的时候引入的,又称为Anonymous functions.字面意思也就是没有定义名 ...

  7. php数组函数(分类基本数组函数,栈函数,队列)

    php数组函数(分类基本数组函数,栈函数,队列函数) 一.总结 1.常用数组函数 函数 描述 array() 创建数组. array_combine() 通过合并两个数组来创建一个新数组. array ...

  8. 18)PHP,可变函数,匿名函数 变量的作用域

    (1)可变函数: 可变函数,就是函数名“可变”——其实跟可变变量一样的道理. $str1 = “f1”;   //只是一个字符串,内容为”f1” $v1 = $str1(3, 4);   //形式上看 ...

  9. 深入理解javascript函数定义与函数作用域

    最近在学习javascript的函数,函数是javascript的一等对象,想要学好javascript,就必须深刻理解函数.本人把思路整理成文章,一是为了加深自己函数的理解,二是给读者提供学习的途径 ...

随机推荐

  1. 巨杉数据库完成C轮数千万美元融资

    业界领先的金融级分布式数据库公司,巨杉数据库近日宣布完成由嘉实投资领投的C轮融资.本轮的领投方为嘉实投资,启明创投与DCM作为早期投资方跟投. SequoiaDB巨杉数据库成立6年来一直坚持技术驱动产 ...

  2. 从零开始学安全(三)●黑客常用的windows端口

    端口可选1-65536 1-1024 预保留端口 留给windows系统服务的 下面是常见的端口对应的服务 1 TCP Port Service Multiplexer 传输控制协议端口服务多路开关选 ...

  3. 原创SQlServer数据库生成简单的说明文档包含(存储过程、视图、数据库批量备份)小工具(附源码)

    这是一款简单的数据库文档生成工具,主要实现了SQlServer生成说明文档的小工具,目前不够完善,主要可以把数据库的表以及表的详细字段信息,导出到 Word中,可以方便开发人员了解数据库的信息或写技术 ...

  4. C# 使用 PerformanceCounter 获取 CPU 和 硬盘的使用率

    C# 使用 PerformanceCounter 获取 CPU 和 硬盘的使用率: 先看界面: 建一个 Windows Form  桌面程序,代码如下: using System; using Sys ...

  5. 先装IIS后装.Net Framework

    1.动态页面和静态页面的区别 动态页面(动态网站):通过C#代码(或别的语言)与服务器的交互的实现(比如新建一个ashx一般处理程序中的C#代码就可以和服务器实现交互,修改数据库,上传图片等都属于和服 ...

  6. [PHP] 算法-数值的整数次方的PHP实现

    给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 思路: 1.指数的二进制表达10^6次方 可以表示10^110(二进制) 10^100 ...

  7. [android] 采用layoutInflater打气筒创建一个view对象

    上一节知道了ListView的工作原理,数据也展示出来了,但是TextView显示的非常难看,如果想美化一下,就先创建好一个布局出来,这个布局采用了两层LinearLayout嵌套,外层的水平方向,内 ...

  8. Netty实战五之ByteBuf

    网络数据的基本单位总是字节,Java NIO 提供了ByteBuffer作为它的字节容器,但是其过于复杂且繁琐. Netty的ByteBuffer替代品是ByteBuf,一个强大的实现,即解决了JDK ...

  9. Socket编程(网络编程)

    网络通信的第一要素:IP地址 通过IP地址唯一的定位到互联网的主机 通过 IP+port(端口号) 来确定互联网的主机上的某个软件 InetAddress:位于java.net包下 getHostNa ...

  10. IDEA项目搭建十四——Web站点Controller基类及布局页静态资源设计

    一.简介 站点搭建完成后,编写页面时一般会有如下几个需求 1.嵌套静态页面时有很大一部分通用代码,如css.js这部分可以使用thymeleaf的局部片段代码块组成 2.这些静态资源默认放在程序中,但 ...