1、PHP 程式設計 .2PHP 簡介 .2PHP 嵌入語法 2引用檔案語法 2程式註解 2PHP 系統常數 .2自定常數 2PHP 的資料型態與變數 .2integer 與 double2string.2string 轉換 2array2多維 array.2型態轉換 2變數的使用和視野 2與變數相關的函數 2運算符號 2流程控制 2ifelse 控制流程 2while 迴圈 2do while 迴圈 2for 迴圈 2switch case 流程 .2中斷語句 break 與 continue .2函數與物件 2函數 2物件 2NULL 值或未定義值 2字串處理 2常規表示式 2常規樣式 2常規
2、表示式函數 2檔案處理 2開啟檔案 2關閉檔案 2處理檔案 2其他常用的檔案處理函數 2從客戶端上傳檔案 2下載至客戶端 2PHP 連線控管 .2持續性連接資料庫 2建立 MySQL 使用者 .2拒絕連接 2利用 PHP 連接 MySQL 2PHP 程序设计PHP 简介PHP 的全名为 “PHP: Hypertext Preprocessor”,意思为 “超文件预处理器”,是一种用来产生 HTML 网页原始文件的中介程序及语言。PHP 是一种伺服端内嵌式 HTML 的应用程序(server-side embedded HTML scripting language),类似IIS 的 ASP。P
3、HP 的语法,基本上是混合了 C/C+、Java、Perl 和自创部份语法。PHP 不像用 C 或 Perl 写成的 CGI 程序,不是用来一大堆指令来输出 HTML 程序,而是直接可以在 PHP 和 HTML 间切换。如以下是一个简单的 PHP 程序:PHP Example其执行时的结果如下画面所示:PHP 程序看起来和用于 client 端的 JavaScript 很相似,只不过,它是用于server 端,我们可以利用它来连接数据库及其他网络资源。当然,PHP 可以产生含 JavaScript 的 HTML 网页。PHP 和 web server 及 client 端浏览器(browser
4、)的关系如下:PHP 是于主机端(Server 端; 服务端)执行的 Script 程序,如:ASP 也是一种Server 端执行的 Script 程序。而 JavaScript 或 VBScript 则是本地端或客户端(Client)执行的程序。例如:我们下达 http:/www.im.chu.edu.tw/dtchang/index.php, 若 index.php 这支 PHP 程序内含有 JavaScript 程序,则 index.php 会先于 www.im.chu.edu.tw 这部机器上执行,而且这部机器上必需安装一套 WEB Server(网站服务器,如:Apache)和可以分
5、析和执行 PHP 的程序或套件。WEB Server 会把 index.php 传给 PHP 的解析和执行器执行,把 index.php 执行的结果以网页的方式回传给浏览器,而回传的网页中可能含有 JavaScript 程序,此时若有需要,则会透过浏览器于本地端(浏览器所在的这一部机器)上执行。因此,WEB-Based 的信息系统开发者必需了解的程序和工具相当的多,还好,一般而言都不会太复杂。PHP 嵌入语法PHP 的语法采用自由格式(free format),其程序常以 括起来,或者是以括来,若经设定也可以用括起来。其写法有如下数种方式: 例: 此种写法最为常见。而 echo(“Hello
6、world!”); 可以写成 echo “Hello world!”; 看起来较像是指令。echo()的功能为 show 出一段讯息。 例: 这种写法是上一种写法的简写方式,一般而言,是需要做 config 设定。 程序代码例::echo “Hello world!”;这种写法很像写 JavaScript,但很少见。 例: 注:当 asp 标签(asp tags)有设定时才可以支持 ASP-style 的写法。这些不同的写法执行时都会显示一行 Hello world,参考如下画面:引用档案语法我们可使用 require()或 include()来把一个档案的内容引入目前的档案中(或执行位置)
7、,以下是 require()和 include()的使用说明: require( “檔名” );文件名所指的程序在网页程序执行前,即加载成为网页程序的一部份;通常放于程序的开头处,应用于程序一定要引入某一个档的时候,换言之,require 的档名是不可以用字符串变量来临时决定要加载那个档案。require()有点像 C 语言的#include,不管 require()会不会被执行到它都会被加载。假如我们想要的是有条件的引用档案,则应使用 include()。关于 include()部份说明于下一段文字。require() 不是函数,因此不会有所谓的传回值,也只会被载入一次。例: require
8、( “config.inc.php” ); include( “檔名” );文件名所指的程序在读到 include 这行指令时才会加载;通常用在程序的流程当中,尤其是选择性的引用时,换言之,include 的文件名可以用字符串变量来临时决定要加载那个档案。例: include( “config.inc.php” );但是要特别注意到使用条件是引入时 include()一定要用括号括起来,否则会产生错误!如下是会产生错的:if($condition) include($file_A);else include($file_B);以下才是正确的:if($condition) include($fi
9、le_A);else include($file_B);使用 include()时,引入档案中可以有 return 值。如 test.php3 和 main.php3位于同一个目录,test.php3 内容为:n“;if (1)return 27;echo “After the return n“;?而 main.php3 的内容为:n“;$retval = include (test.php3);echo “File returned: $retvaln“;echo “Back in main.php3n“;?则于 PHP4 中执行的结果为:Before in main.php3Before
10、 the return File returned: 27Back in main.php3【注意】:执行到 return 处为止。然而在 PHP3 中这是不合法的, PHP3 中include()是不能传回数值的。假如把 main.php3 改成:n“;include (test.php3);echo “Back in main.php3n“;?则 PHP3 会产生 parse error(剖析错误,由语法或打字错误所产生):Before in main.php3Before the return 27Back in main.php3Parse error: parse error in
11、.这是因为 return 指令并不是位于函数的括号中,而是位于非函数的括号中,只要把 return 移到括号之外即可。 【注意】:当 PHP 执行 require()和include()时会由 PHP 模式转为 HTML 模式,档案引入完成时,再转回 PHP模式。因此,若 require()或 include()的档案中有使用 PHP 语法,则需使用合法的 PHP 开始和结束的标记(TAG)。假如 main.php3 改成:n“;require (test.php3);echo “Back in main.php3n“;?其结果为:Before in main.php3Before the r
12、eturn After the return Back in main.php3【注意】:和用 include()的结果不同!程序批注 可以使用标准 C 语言多行的批注/* 批注文字 */ 也可以使用标准 C+语言单行的批注/ 批注文字PHP 系统常数PHP 的系统常数和内容,如下表所示:系统常数名称 内容的定义_FILE_ 目前被解析的 PHP 程序的文件名,若目前被解析的程序是 include()或require()中的程序则改为本子程序的档名,而不是父程序的文件名_LINE_ 本_LINE_出现处位于 PHP 程序的行号,即本行为第几行。若目前被解析的程序是 include()或 req
13、uire()中的程序则改为本子程序的行号PHP_VERSION PHP 的版本代号,如: “3.0.8-dev”PHP_OS 执行 PHP 程序的 OS 别,如: “WIN32”, “Linux”TRUE true 真值FALSE false 假值E_ERROR mask 值为 1,发生错误时,用来设定error_reporting()的层级。通常ERROR 发生时,程序会中断并产生错误的讯息报告E_WARNING mask 值为 2,同上,用于WARNING 警告发生时。程序不会中断,可帮助 debug(除错)E_PARSE mask 值为 4,同上,用于分析语法错误发生时E_NOTICE
14、mask 值为 8,同上,不寻常的讯息发生时,如: 存取未定义的变量、档案,大都用于除错,此时任何可能的错误皆会报告E_CORE_ERROR mask 值为 16,同上,PHP 核心程序产生错误时E_CORE_WARNING mask 值为 32,同上,PHP 核心程序产生警告时E_ALL 所有可能的错误 1+2+4+8+16+32系统一般默认的错误层次为 E_ALL echo (“本 PHP 版本为“.PHP_VERSION.“ 执行于“.PHP_OS.“操作系统.n“);echo “本 PHP 档名为“._FILE_.“n“;/ 注: 文字字符串可用 “.“ 这个符号串接echo “现在所
15、在的行号为:“._LINE_.“n“;if(error_reporting( E_ERROR|E_WARNING|E_PARSE|E_NOTICE)echo (“设定成功!n“);echo “下一行会产生 E_NOTICE 的错误.n“;stat( “hello.php3“ );echo “Continue.n“;?执行后的 HTML 原始码为:Content-Type: text/htmlX-Powered-By: PHP/4.0b4pl1Content-Type: text/htmlHello world!本 PHP 版本为 4.0b4pl1 执行于 WIN32 操作系统.本 PHP 档名
16、为 C:WINDOWSTEMPtmpF3B1.TMP现在所在的行号为:7设定成功!下一行会产生 E_NOTICE 的错误.Warning: stat failed for hello.php3 (errno=2 - No such file or directory) in C:WINDOWSTEMPtmpF3B1.TMP on line 11Continue.透过 Navigator 观看的结果为:Content-Type: text/html X-Powered-By: PHP/4.0b4pl1 Content-Type: text/html Hello world!本 PHP 版本为 4
17、.0b4pl1 执行于 WIN32 操作系统.本 PHP 档名为 C:phpPHPEdNONAME1.php3现在所在的行号为:7设定成功!下一行会产生 E_NOTICE 的错误.Warning: stat failed for hello.php3 (errno=2 - No such file or directory) in C:phpPHPEdNONAME1.php3 on line 11Continue.假如 error_report = E_ALL 例:n“;/ 移去下一行的批注符号后会产生 “parse error“/ 常数值是无法改变的./ MY_VER = “xwin 3.2
18、.2“;/ 下一行将不会产生错误,也不会重新定义常数之值define( “MY_VER“, “new value“);echo “MY_VER=“.MY_VER.“n“;?执行画面如下:PHP 的数据型态与变量PHP 支持的数据型态不多,有:string(字符串) ,integer(整数) ,double(双浮点数) ,array (数组)和 object(对象)等等。变量事先不需要宣告,可以直接使用,变量的名称前面要加上$以作为识别,变量的名称有大小写之分(注: PHP 的变量用$ 符号开头,是不是很棒?很多人最喜欢的东西不就是这个?) 。若被引用的变量事先没数据,则设为 null 值(我们
19、可以用 empty()或 isset()来检验它)。而数据的型态,基本上,并不是由程序设计师所决定的,而是于执行时期由 PHP 依照该变量的内容(context)来决定的。假如我们想要强迫某变量为某特定的数据型态,则可以用 settype()或 cast 来改变。如下例:$a = 10; / integer$b = (double) $a; / force $b to double可以用的 cast 有(int) 、(integer)、(real)、(double) 、(float)、(string)、(array)和(object)。而利用 settype()函数则是另一种方式。settyp
20、e()函数的雏型为:int settype(string var, string type);其中 var 为变量的名称,而 type 型态可为: “integer”、 “string”、 “double”、 “array” 和 “object”。若转换成功则传回 true,失败则传回 false。我们可用gettype()来取得变量的数据型态。以下是转换的例子:n“;echo “b=“.$b.“,type b is “.gettype($b).“n“;echo “c=“.$c.“,type c is “.gettype($c).“n“;echo “d=“.$d0.“,type d is “.
21、gettype($d).“n“;echo “e=“.$e-scalar.“,type e is “.gettype($e).“n“;?注意: “.” 为串接字符串文字的运算符符号。其执行结果如下:a=10,type a is integerb=10,type b is doublec=10,type c is stringd=10,type d is arraye=10,type e is object【注意】:数值或字符串转换成 array 时,自动设索引值为 0 之元素,而数值或字符串转换成 object 时则变量值自动变成 object 的属性值(attribute),而且以scalar
22、 为属性名 (attribute name)。在 PHP3.x 版中只支持数值设定(assign by value),换言之,当我们把变量设定为某式子的结果时,表示式最终的结果值会被复制到该变量。因此如下的式子:$a=$b; / 将 $a 之值设为 $b 之值$b+; / 将 $b 增加 1当$b 改变时并不会影响到$a。在 PHP4.x 版则新增参考设定(assign by reference)的语法。换言之,使用参考设定时,新的变量会参考旧变量,也就是说新变量是旧变量的别名(alias)或指向(point to)该变量。此时,改变新变量的值也会异动旧变量的值,反之亦然。要使用参考设定则加$
23、a = “$name”;$b = $name;结果 $a 的内容为 “blob” 这个文字,而 $b 的内容则为 “$name” 这个文字。换言之,用单引号括起来的字符串中的任何文字皆不会被改变,但用双引号括起来的文字中若含变量名称,则会以变量之值取代之。integer 与 doubleinteger(整数)和 C/C+ 一样有多种表示法,以 0 开头者表示为八进制,而 0x 或 0X 则表示为十六进制。而 integer 的有效范围在 32 位的操作系统中为正负 21 亿左右( -2,147,483,648 +2,147,483,647)。double(浮点数)则是含有小数点的数值,可用科学
24、表示法表示,如: 12.34, -1.23, 2.34+E30, -1.23e-20,有效范围为 1.7E-308 1.7E+308。设定数值的例子如下:注: PHP 允许用 # 做为批注文字的开头。stringstring(字符串) 可以为单一字符或多字符的字符串。脱离码(Escape sequence)的用法和 C/C+一样,如:”, , n, r, t 等等。字符串与变量间可用 “.” 串接。字符串的标示方法有两种:(一)用双引号括起来、 (二)用单引号括起来。用双引号括起来的字符串中若含有变量名,则该变量会被展开(expand),而用单引号括起来者则否。用双引号括起来的字符串可以使用脱
25、离码(Escape sequence),其规则和 C/C+及 perl 一样。脱离码如下:脱离码 意义n new line(新行 )r carriage return(归位)t horizontal tab(水平定位点) blackslash(反斜杠 )$ dollar sign(钱号 )” double-quote(双引号)0-71,3 octal notation(最多三位的八进制),如:077x0-9A-Fa-f1,2 hexadecimal notation(最多二位的十六住位数),如:x8F但若用单引号则只认得 (反斜杠) 及 (单引号)两种特殊的脱离码,其他的一律不做修改。另外,P
26、HP(PHP 4.0 以上)也提供了一种类似 shell 的字符串输入写法 doc syntax(换言之,EOD . EOD 之间的文字是一串输入之文字,其执行的结果画面如下:在 PHP 中字符串可以用点(dot .)串接字符串或变量,但不可以用 + 号。字符串中的字符可以用数组索引的方式运作(如 C/C+),如:$str= “Hello”; 则 $str0 为第一个字符 H。注意:PHP 没有字符(char)这种型态,只有字符串(string)这种型态。所以$c = x;是把 $c 设为一个字符串,其值只含单一个字符,这和 C/C+是不一样的。以下是一个示范的程序:Number: 9 */$
27、num = 9;$str = “Number: $num“;/* str 结果(不会展开) 为 Number: $num */$num = 9;$str = Number: $num;$str = This is a test.;$first = $str0; /* 取得第一个字符(索引值为 0) */$str = This is still a test.;$last = $strstrlen($str)-1; /* 取得最后一个字符 */* 把第五个字符设成 p */$str = This is still a test.;$str5 = “p“;?string 转换当字符串要转成数值时,
28、PHP 依照下列的规则转换: 若字符串中包含有: .、 e 或 E,则转成 double。否则,则转成整数(integer)。 若字符串中含有非数值表示法的资料,则取最前头的数值字符串转换之。若开头处即为数值性文字则转为 0。 若字符串无法正常的转换发生时,此时,最终的数据型态由其他的表达式决定。例:以下是一个混合应用的杂例:n“;if( empty($a) )echo “a=nulln“;if( !isset($a) ) echo “a=undefinedn”;$a=“hello“;echo “(1)a=“.$a.“ length=“.strlen($a).“n“;$a2=”p”;echo
29、“(2)a=“.$a.“ length=“.strlen($a).“n“;$a=”;echo “(3)a=“.$a.“n“;echo “(4)a=“.$a.“ length=“.strlen($a).“n“;$a=2000;/ 以下会 show 出 (5)a=2010 length=4echo “(5)a=“.($a+10).“ length=“.strlen($a).“n“;?执行结果为如下:array在 PHP 中 array(数组)则较为特殊,array 可以是多维数组,数组的设定变化较多和自由,数组的索引不限定只可以用整数,也可以用字符串来标示。假如没有标明数组的索引值,如:a,则会引
30、用上一个整数之索引值往下递增,如先前使用到 a5,则下一个 a相当于 a6。给定数组初值时用 array 关键词来标明。基本上,PHP 的 array 很像哈希表和索引数组的综和体(hash table and indexed array),我们可以用数值的索引方式(index 值从 0 开始),也可以用字符串做为键值(key)的哈希表。而 array 的 key 值和资料值则用 = 做关连。以下是一个简例:$a0 = “abc“; #数值索引 0$a1 = “def“; #数值索引 1$b“apple“ = 13; #键值 “apple”$b“orange” = “水果”; #键值(key)
31、 “orange” 对应到值 (value) “水果”$c = 10; # $c0=10;$c = 20; # $c1=20;基本上,当我们没标明索引值或键值时(index or key),PHP 会自动由index=0 开始设定数组的值,假如先前有用 index 的方式设定过数组的元素,则自动延伸其 index 值为下一个可用的 index 值(该值不一定为 index+1,因为它可能已经存在了) 。如:n“;print_r($b);?其结果为Array(2 = 103 = 12)Array(0 = 1001 = 200)【注意】:$a2和$a“2”是同一个元素,但和$a“2a”则不会一样。
32、换言之,数值索引会被转成文字键值。因此,$a0和$a00 和$a“0”相同,但不同于$a“00”。上例中用到 print_r() 这个函数,它可以将任何资料以人们可阅读的方式显示出来,是一个相当好用的函数。Arrays 可以用 array 这个关键词和 = 这个设定子一次设定多个元素,其效果和逐一分开是一样的。如:“;$b=array(1=20,0=10);print_r($b);echo “;$c=array(12=10, “11“=20, 30, 40);print_r($c);?其结果为:其设定的方式是由左至右依序设定。当然,数值索引和文字键值是可以混合使用。要注意的是如下:20,“11
33、“=10);print_r($b);?其结果为Array ( 11 = 10 )只有一个元素$b“11”(或者说 $b11),且其值为 10。换言之,$b11被设成20,接着,$b“11” 被设成 10,而$b11 和$b“11” 是同一个元素,因为整数 11转成字符串时是 “11” !Arrays 可以用 asort(), arsort(), ksort(), rsort(), sort(), uasort(), usort() 和 uksort() 等函数来做各式各样的排序。除此之外,array 也可以用 next(), prev(), current(), each(), end() 以
34、及 reset() 等来移动目前 array 指针的位置。然而,array 中的元素值有可能为 0 或 “” 或 null 等状况会造成 next()及 current()产生false,此时可能会造成没有把整个 array 走完(walk through)。因此若需要走完array 中所有的元最好用 each()。其中,reset()为 array 指标移到最前头,而 end()为移到最后,prev() 为取得前一个元素之 value,current()为取得目前的元素之value,而 each()为传回目前的元素之 key 和 value 对并移动指针到下一个位置,each()的传回值是
35、array,包括 0,1,key,value,其中 0和“key” 为 key 值(键值) ,而1 和“value”为 data value(资料值)。 【注意】:prev()、current()和 next()只传回 data value(资料值) !以下是 array 运作的相关的一些函数列表:函数名称 功能 雏型asort() 由小到大排列 array,索引值或key 值不变void asort(array array);arsort() 由大到小排列 array,索引值或key 值不变void arsort(array array);ksort() 依 key 值由小到大排列 arra
36、y void ksort(array array);krsort() 依 key 值由大到小排列 array void krsort(array array);rsort() 由大到小排列 array,索引值改变(用数值)void rsort(array array);sort() 由小到大排列 array,索引值改变(用数值)void sort(array array);uasort() 依用户定义的比较函数,由小到大排列 array,索引值不变void uasort(array array, function cmp_function);uksort() 依用户定义的比较函数,依 key值
37、排列 arrayvoid uksort(array array, function cmp_function);usort() 依用户定义的比较函数,由小到大排列 array,索引值改变void usort(array array, function cmp_function);count() 计算数组的元素个数,若为一般变量则传回 1,若该变量未定义则传回 0int count(mixed var);例:“lemon“, “a“=“orange“, “b“=“banana“, “c“=“apple“);/ 结果: fruitsc = apple, fruitsb = banana, frui
38、tsd = lemon, fruitsa = orangeasort ($fruits);$fruits = array (“d“=“lemon“, “a“=“orange“, “b“=“banana“, “c“=“apple“);/ 结果: fruitsa = orange, fruitsd = lemon, fruitsb = banana, fruitsc = applearsort($fruits);$fruits = array (“d“=“lemon“, “a“=“orange“, “b“=“banana“, “c“=“apple“);/ 结果: fruitsa = orange,
39、 fruitsb = banana, fruitsc = apple, fruitsd = lemonksort ($fruits);$fruits = array (“lemon“, “orange“, “banana“, “apple“);/ 结果: fruits0= “orange“, fruits1= “lemon“, fruits2= “banana“, fruits3= “apple“rsort ($fruits);$fruits = array (“lemon“, “orange“, “banana“, “apple“);/ 结果: fruits0 = apple, fruits
40、1 = banana, fruits2 = lemon, fruits3 = orangesort ($fruits);/ 以下的程序代码可以列出 array 的内容for (reset ($fruits); list ($key, $value) = each ($fruits); )echo “fruits$key = “, $value, “n“;/ 以下的程序代码为列出 each() 的内容echo “;for( reset($fruits); $a = each($fruits); )print_r($a);echo “;?以下是执行的结果(注意:我们用 echo() 和 print
41、_r() 的部份才有列出来!):从图上的后面数行,我们发现 each() 传回的值是一个 array,索引值 0($a0) 和 “key”($a“key”) 是指到该元素的数组索引,而索引 1($a1) 和 “value”($a“value”) 则指到该元素的数据值。以下则是用用户自定的比较函数之排序程序范例:(比较函数和 C/C+ 的规则一样,$a=$b 时传回 0,$a$b 时传回正数,$a $b) ? -1 : 1; / 若 $a$b 则传回 1,否则传回 1$a = array (3, 2, 5, 6, 1);usort ($a, cmp); / 呼叫 usort() 指定排序的函数名
42、称为 cmp,即 cmp()while (list ($key, $value) = each ($a)echo “a$key: $valuen“;?注:list()可以一次设定多个变量值,list()不是函数而是 PHP 的语法。执行的结果为:a0: 6 a1: 5 a2: 3 a3: 2 a4: 1以下是 array 移动及读取的相关函数列表:函数名 功用 雏型reset() 重置 array 并传回 first element 之值 mixed reset(array array);end() 移到 array 最后一个元素 end(array array);prev() 移到前一个元素
43、并传回该 element 之值 mixed prev(array array);current() 读取目前所在元素之值(不做移动) mixed current(array array);next() 移到下一个元素并传回该 element 之值 mixed next(array array);each() 用 array 的方式传回目前 element 数据,并移到下一个位置array each(array array);key() 目前所在元素之键值(未移动前为第 0 个元素所在)mixed key(array array)array_walk() 以用户定义的函数将数组走过(walk)一
44、次 int array_walk(array arr, string func, mixed userdata);【注意】:prev/current/current 传回值为 0、 “”、null 皆会产生 false,移动失败也会产生 false。以下是一个示范例子:(注意:sort()把 key 值改变成数值)“lemon“, “b“=“orange“, “c“=“banana“, “d“=“apple“);/ 结果: fruits0 = apple, fruits1 = banana, fruits2 = lemon, fruits3 = orangesort ($fruits);pri
45、nt_r($fruits);echo “;/ 以下的程序代码可以列出 array 的内容$i=0; # 预防打字错误造成无限循环用, 可以去除echo “;for (reset ($fruits); current($fruits) ; next($fruits)echo current=.current($fruits).“;$var = each($fruits);echo $var0=.$var0.“;echo $var1=.$var1.“;echo $var“key“=.$var“key“.“;echo $var“value“=.$var“value“.“;echo prev=.pre
46、v($fruits).“;$i+; # 预防打字错误造成无限循环用, 可以去除if( $i = 8) echo “error“; break; # 预防打字错误造成无限循环用 , 可以去除echo “;?其执行结果如下:注意:执行 each() 时,会自动地移动位置到下一个元素的位置。又如:(注意 key()值的变化)n“;next($a);$a=40; / 新增一个元素!echo key($a).“=“.current($a).“n“;reset($a);echo key($a).“=“.current($a).“n“;print_r($a);?执行的结果为:0=101=200=10Arra
47、y ( 0 = 10 1 = 20 2 = 30 3 = 40 )至于 array_walk()可用来把数组的元素以用户定义的函数处理过一遍,把所有的元素皆走过一次。其用法为指定要处理的数组名为第一个参数,要使用的函数为第二个参数。array_walk()函数会把元素的数值(value)当做第一个参数传给用户函数,把元素的键值(key),当做第二个参数传给用户函数。假如 array_walk()有使用第三个参数,则第三个参数会成为用户函数的第三个参数。如:n“;function show2($v, $k)echo “key=$k, value=$vn“;function show3($v, $
48、k, $extra)echo “key=$k, value=$v($extra)n“;$arr=array(“ca“,“us“,“tw“,“cn“,“uk“);array_walk($arr,show);reset($arr);array_walk($arr,show2);reset($arr);array_walk($arr,show3,“para3“);?其结果为:value=cavalue=usvalue=twvalue=cnvalue=ukkey=0, value=cakey=1, value=uskey=2, value=twkey=3, value=cnkey=4, value=ukkey=0, value=ca(para3)key=1, value=us(para3)key=2, value=tw(para3)key=3, value=cn(para3)key=4, value=uk(para3)多维 arrayPHP 使用多维数组相当的简单,只要加上另一个 key