第10章 常用函数
发布时间:2010-10-01 07:15:16
发布时间:2010-10-01 07:15:16
PHP之所以简洁易用,就是因为它内置了大量功能强大的函数,只要能熟练地操作这些函数,就可以通过少量的代码实现复杂的功能。
内置函数涉及PHP应用的各个方面,数量众多,本章仅仅介绍几个常见应用中的常用函数,更多的函数说明请参考PHP手册。
程序处理过程中离不开对数据进行存储、处理。为了更好地处理字符,我们定义了:任意长度的字符序列为字符串。字符串可以存储、代表、理解实际生活中很多的数据,PHP提供了大量的字符串处理函数,帮助我们解决实际中的问题。
可以使用函数strlen()来检查字符串的长度,如果客户端传递过来一个字符串到服务器。我们有时需要对字符串的长度进行限制,可以用strlen( )返回字符串的长度。
int strlen ( string string ) //函数的返回值为int类型,参数为字符串类型
$str = 'php';
echo strlen($str); // 3
$str = ' php\n ';
echo strlen($str); // 6
?>
我们已经使用过“= =”号来比较两个字符是否相等。但是详细的比较需要通过函数来处理。在学习这些大量函数时,经常使用能帮助记忆,但是也要养成归纳总结的习惯,把功能类似,外观类似的函数统一记忆。
字符串比较函数:strcmp(),strcasecmp(),strncmp()。
int strcmp ( string str1, string str2 )
例如:
if(strcmp(“php1”, “php2”))
echo “ok”;
else
echo “next”;
?>
运行结果:ok //注意if语句的判断条件
从左到右逐个比较,如果一样,继续比较下一个字符。前面的字符ASC码大返回大于零的数字,后面的字符ASC码大返回小于零的数字,相等返回零。这样我们就可以验证两个字符串,通过返回值来进行进一步的操作。
int strcasecmp ( string str1, string str2 )
函数strcasecmp( )比较两个字符串,不区分大小写,其余功能与strcmp函数一样。
if(strcasecmp("php OK","php ok"))
echo "ok";
else
echo "next";
?>
运行结果:next
如果要确定比较的位数,用strncmp(string1,string2,length ),最后的参数为比较的位数。返回值大于0,那么string1的ASC码比string2大;等于0,那么string1的ASC码与string2相等;小于0,那么string2的ASC码比string1大。length确定比较的位数。
例如:
if(strncmp("phpchina","phplinux",3))
{
echo "ok";
}
else
{
echo "next";
}
?>
结果:ok //比较前三位,得数据
if(strncmp("phpchina","phplinux",4))
{
echo "ok";
}
else
{
echo "next";
}
?>
结果:next //比较前四位的数据
有的时侯你需要去发现一个字符串是否有特殊的子串,这个特殊的子串从什么地方开始,等等。当你需要匹配字符串时,可以使用字符串函数。如果需要一个匹配的模式,可以使用常规表达式。
strstr(string,标志字符)查找到标志在string中第一次出现的位置,并且输出以后的部分。标志字符区分大小写。Strchr为strstr的别名。Stristr(string,标志字符)标志字符不区分大小写。
实例:strstr.php
$a="php China php china";
echo strstr($a,"c")."";
echo stristr($a,"c");
?>
输出结果:
china
China php china
strrchr(string,标志字符),标志字符在 string里面的最后一次出现的位置输出以后的字符。
实例:strrchr.php
$a="php China php linux ";
echo strrchr($a,"l")."";
?>
结果:linux
如果需要从字符串中查找,取出字符,我们可以使用substr函数:
substr( string , start , length)
从string 中取出字符串,从start位置后面开始取出length的长度。字符串位置开始值为零。如果没有指出length,那么默认一直到字符串末尾。
$name=“let us try this function”;
//从零开始数到第六个字符开始,取出的长度为4个字符。
$result = substr($name,6,4);
函数:substr_count(big-string,small-string);。
函数substr_count的意义是返回small-string字符串在big-string字符串里出现的次数。
函数:substr_replace(old-string,new-string,start,length)。
函数substr_replace的意义是在old-string字符串中插入new-string字符串,start 是替换的位置,length是替换的位数。如果length为零则可直接插入,不替换原来的内容。如果length没有指定,那么后面的内容将全部替换。start数值为正数那么从左向右移动,从1开始;start数值为负数时从右向左移动。定位后替换位数length,替换的字符顺序为正常顺序替换,替换后面的字符。
实例:substr.php
$a="I@like music very much";
$b=substr($a,4);
echo "$a"."";
echo "$b"."";
$b=substr($a,0,12);
echo "$b"."";
$b=substr($a,0,12132);
echo "$b"."";
$b=substr_count("abcadefgA","a");
echo "$b"."";
$b=substr_replace("abcdefg",":-)",2,0);
echo "$b"."";
$b=substr_replace("abcdefg",":-)",2);
echo "$b"."";
$b=substr_replace("abcdefg",":-)",2,4);
echo "$b"."";
$b=substr_replace("abcdefg",":-)",-3,2);
echo "$b"."";
?>
效果:
你可使用str_word_count() 函数去数出字符串中单词/文字的数量:
$string = 'The quick brown fox';
echo str_word_count($string);
/* 4 */
?>
字符串查找函数,返回位置:
strops(large-string,small-string)查找第一次出现的位置。
strrpos(large-string,small-string)查找最后出现的位置。
实例:strops.php
$a="linux php apache mysql php linux mysql apache ";
$b="php ";
echo strlen($a)."";
echo strlen($b)."";
echo strpos($a,$b)."";
echo strrpos($a,$b);
?>
结果:
46
4
6
23
函数str_pad(string,length,type);填充的类型为STR_PAD_LEFT/RIGHT/BOTH,默认为rightstr_pad函数实现了把字符串type 填充到字符串string中,使string的长度达到length。从左、右、两面填充。
$a="ENJOY php ";
$b="$";
echo str_pad($a,20,$b,STR_PAD_BOTH)."";
echo str_pad($a,20,$b,STR_PAD_LEFT)."";
echo str_pad($a,20,$b,STR_PAD_RIGHT)."";
echo str_pad($a,20,$b)."";
?>
效果:
函数:strtok(string,分割标记)。
$a=string;
$b=strtok($a,分割标记);
while($b != = false )
{
echo($b.””);
$b=strtok(分割标记);
}
$b为参数分割后的第一个字符串。用“strtok(分割参数)”每次调用“strtok(分割标记)”就会得到以后的字符串。
实例:strtok.php
$string="lose@this@is@a@test@to@strtok";
$check="@";
$tok=strtok($string,$check);
while($tok !== false)
{
echo "$tok"."";
$tok=strtok("$check");
}
?>
效果:
lose
this
is
a
test
to
strtok
具体使用浏览http://www.php.net/strings 参考有关字符串的函数,或下载帮助文档。因为要记住每一个字符串函数的确切功能是不实际的。
Trim(string):删除字符串的开始和结尾的空白符。
Ltrim(string):删除字符串开始的空白。
rtrim(string):删除字符串结尾的空白。
用strlen显示字符串的字符个数。
实例:trim.php
$a="\t china \nphp \n\r";
echo strlen($a)."";
$b=trim($a);
echo strlen($b)."";
$b=ltrim($a);
echo strlen($b)."";
$b=rtrim($a);
echo strlen($b);
?>
结果:15 10 13 12
strtolower(string):所有字符变为小写。
strtoupper(string):所有字符变为大写。
ucfist(string):字符第一个字母变为大写。
ucwords(string):字符中单词第一个字母变为大写。
函数:strrve(string)翻转字符串。
函数:str_repeat(string,count)。
重复count次string参数组成的新字符串:
echo str_repeat(‘-’,20);
实例:strtolower.php
$a="php PHP pHp PhP China";
echo strtolower($a)."";
echo strtoupper($a)."";
echo ucfirst($a)."";
echo ucwords($a)."";
echo strrev($a)."";
echo str_repeat(":-)",10);
?>
结果:
printf( )可以按照要求输出不同类型的值
printf(‘the value of %d is %x’,214,214);
输出结果::the value of 214 is d6
%后面添加参数,
b代表显示二进制,d代表显示十进制。
参数X显示大写字母的十六进制的数,
参数x显示小写字母的十六进制的数。
后面的数值是代替的值,就是按照位置依次把数据放入。
sprintf( )函数:
需要参数把sprintf的数值传递出来才可以输出。
$date=sprintf(“%d is %b”,213,123);
程序如下:
print("hello,linux")."";
$a="mysql";
$b="php";
$d="27";
printf("the value is %s"."",$a);
printf("the value is %b"."",$d);
printf("the value is %d"."",$d);
printf("the value is %x"."",$d);
printf("the value is %X"."",$d);
$c=sprintf("I like %s very much",$b);
echo "$c";
?>
效果如下:
对于字符串的处理能力,是评定一个程序优秀与否的标准之一,PHP提供了丰富的处理函数,简单易用。虽然与面向对象Java的JSP程序相比,JSP通过类的继承把庞大的类库建立了联系,不同的方法之间有各种血缘关系,但是这样也加大了程序的难度和入门的门槛。对于普通的企业和一般的商业网站,PHP是最适合的语言。
习题:
1.以下代码运行结果:
$A = "PHPlinux";
$B = "PHPLinux";
$C = strstr($A,"L");
$D = stristr($B,"l");
echo $C ." is ". $D;
?>
A PHP is Linux
B is Linux
C PHP is Linux
D PHP is
2.以下代码运行结果为:
$first = "This course is very easy !";
$second = explode(" ",$first);
$first = implode(",", $second);
echo $first;
?>
A.This,course,is,very,easy,!
B.This course is very easy !
C.This course is very easy !,
D.提示错误
3.PHP中,下列哪个函数是将字符串前后颠倒:
A.strrev()
B.strrpos()
C.strstr()
C.strfirst()
4.以下程序横线处应该使用的函数为:
$email = ‘langwan@phpchina.com.cn’;
$str = ____($email,’@’);
$info = ____(‘,’,$str);
____($info);
?>
输出结果为:
([0] => @phpchina [1]=>com[2]=>cn)
A.strchr, split, var_dump
B.strstr, explode, print_r
C.strstr,explode, echo
D.strchr, split, var,_dump
5.在str_replace(1, 2, 3)函数中1 2 3正确的排列顺序为:
A.“取代字符串”“被取代字符串”“来源字符串”
B.“被取代字符串”“取代字符串”“来源字符串”
C.“来源字符串”“取代字符串”“被取代字符串”
D.“来源字符串”“被取代字符串”“取代字符串”
正则表达式为我们提供了一种高效、高级的处理字符串的方法。正则表达式经常用于验证表单的提交内容,判断电话号码、地址、E-mail的地址、身份证号码、生日是否有效。
PHP支持两种风格的正则表达式的语法:POSIX和Perl。POSIX风格的正则表达式是PHP时的默认风格,但可以通过编译PCRE(Perl-compatible regular expression,Perl兼容正则表达式)库来使用Perl风格。我们将简单介绍POSIX的风格,但如果你已经是一位Perl程序员,或者希望了解更多关于PCRE的内容,可以阅读在线手册:http://php.net。
到目前为止,我们进行的所有模式匹配都使用了字符串函数。我们只限于进行精确地匹配或精确的子字符串匹配。如果希望完成一些更复杂的模式匹配,应该用正则表达式。正则表达式在开始时候很难掌握,但却是非常有用的。
正则表达式是一种描述一段文本模式的方法。我们前面所用到过的精确(文字)匹配也是一种正则表达式。
在PHP中,匹配正则表达式更有点像strstr()匹配,而不像相等比较,因为是在一个字符串的某个位置(如果不指明则可能在字符串中的任何位置)匹配另一个字符串。例如,字符串“shop”匹配正则表达式“shop”。它也可以匹配正则表达式 “h”、“ho”,等等。
除了精确匹配字符外,还可以用特殊字符来指定表达式的元意(meta-meaning)。
例如,使用特殊字符,可以指定一个在字符串开始或末尾肯定存在的模式,该模式的某部分可能被重复,或模式中的字符属于特定的某一类型。此外,还可以按特殊字符的出现来匹配。接下来,我们将逐个讨论这些变化。
使用过正则表达式的人们可能会体会到它的两面性,功能强大但是非常复杂,我们可以匹配出一套合法的表达式,例如:
^\-{0,1}[0-9]{0,}\{0,1}[0-9]{0,}$
这段有效的难以理解的代码足够使很多人放弃使用正则表达式,但是如果确实理解了它的规则,会发现这些知识在其他语言(Perl,JavaScript 等)或者很多Linux环境(vi ,emacs,awk)也可以通用。
模式是正则表达式最基本的元素,它们是一组描述字符串特征的字符,模式可以很简单,由普通字符串组成,也可以很复杂,包含很多特殊字符。我们从最简单的模式开始,循序渐进地学习。
^happyphp 是由特殊字符^与字符串happyphp组成的模式,表示只匹配以happyphp开头的字符串并且区分大小写。
happy$ 是由特殊字符$与字符串happy组成的模式,表示只匹配以happy结尾的字符串,并且区分大小写。
只匹配 happyphp 字符串。
如果是普通字符,例如:php作为模式那么与字符串hello php,page home person是匹配的。这个模式是由字母(p h p )组成的,即它们表示字母本身,数字也是一样。但是对于其他字符表示,如标点符号、制表符号、换行符号都要用到转义字符。例如,\n表示新行,\t表示制表符,\r表示回车,\.表示匹配句号。
为了更加有效地匹配,可以使用特殊字符[ ]表示范围,我们可以把需要的字符放在[ ]中表示一个字符。可以与其他的特殊字符组合来实现更强的功能。
[a-z]:表示匹配任何一个小写字母。
[A-Z]:表示匹配任何一个大写字母。
[a-z A-Z]:表示匹配所有的字母。
[0-9\-\.]:匹配数字、减号、句号。
^[^0-9]:^符号在[ ]内表示非(排除),表示第一个字符不能是数字。
^.5$:匹配两个字符,表示以5结尾的任何非空的字符。
用竖线(|)符号在一个正则表达式中制定可选部分:
^cat | dog$
以cat 开始或者以dog结尾:
^(cat | dog)$
必须以cat开始并且以dog结尾。
用特殊符号代表字符的数量:
.——代表一个除\n以外的字符。
?——代表零或者一个。
*——代表零或者更多。
+——代表一个或者更多。
用{ }来确定花括号中内容连续出现的次数:
a{n}——代表a连续出现了n次。
a{n,}——代表a连续出现了至少n次。
a{n,m}——代表a至少连续出现n次但是不能超过m次。
php提供了5个常用的函数来处理正则表达式。
(1)ereg()和eregi()用于简单的查询。
(2)ereg_replace()和eregi_replace()用于搜索替换。
(3)split()用于分离字符串。
ereg(string pattern,string,source array)
如果在原字符串中找到匹配,那么返回真,否则返回假。
eregi(string pattern,string,source array)
匹配时忽略大小写,其他功能与ereg相同。
实例:ereg.php
$email="zhangzhen@discuz.com";
if(ereg("^(.+)@(.+)\\.(.+)$",$email,$arr))
{
echo "eamil address: $arr[0]"."";
echo "username: $arr[1]"."";
echo "Domain name: $arr[2]"."";
echo "Top-domain: $arr[3]"."";
}
else
{
echo "email address wrong";
}
?>
运行结果:
eamil address: zhangzhen@discuz.com
username: zhangzhen
Domain name: discuz
Top-domain: com
ereg_replace(string pattern,string replacement,string)在字符串string中搜索制定模式pattern,如果匹配用replacement替换;eregi_replace 匹配时忽略大小写,功能与ereg_replace一样。
实例:ereg_replace.php
$str="The text is replace";
$pat="^the";
$rep="that";
$a=ereg_replace($pat,$rep,$str);
echo "ereg_replace: $a"."";
$b=eregi_replace($pat,$rep,$str);
echo "eregi_replace: $b";
?>
运行结果:
ereg_replace: The text is replace
eregi_replace: that text is replace
函数split用于分离字符串:
split(string pattern,string string,int)
pattern作为分隔符返回一个数组,分隔符把字符串分成几部分,int为可选参数,当达到int的数值后其他字符作为数组最后一个元素输出。
实例:split.php
$str="my-love-php-linux-apache-word";
$pat="[-]";
$arr=split($pat,$str);
$num=count($arr);
for($i=0;$i<$num;$i++)
{
echo "$arr[$i]"."";
}
?>
运行结果:
my
love
php
linux
apache
word
我们分析一个简单的例子来练习前一部分所学的知识。在程序的设计过程中,我们经常把自己定义的函数存放在一个文件中,这样方便统一的管理、规划。
common.php
define("company","PHP China"); //定义常量
define("nl","\n"); //定义常量
function check_email($str) //定义函数
{
if(ereg("^(.+)@(.+)\\.(.+)$",$str)){
return 1;
}
else
{
return 0;
}
}
?>
提交页面:worktable.php
require("common.php");
?>
echo "company";?> Job table
please enter your name(request):
please enter your phone number:
please enter your mailling address:
please enter your E-mail(reauire):
please select your work:
please select your country:
I am agree with
用户可以在这个页面上输入资料,提交到页面work_action.php处理。在程序中如果需要使用我们自定义的函数和常量,程序会通过require("common.php");引用页面common.php自动调用需要的程序。
处理页面:work_action.php
require("common.php");
$name=$_POST[username];
$phone=$_POST[phone];
$address=$_POST[address];
$email=$_POST[email];
$work=$_POST[work];
$country=$_POST[country];
$submit=1;
if(!name)
{
$submit=0;
$name="name";
}
if(!check_email($email))
{
$submit=0;
$email="
error emial address can not put into database";
}
echo (
"your have submit ".nl.nl.
"name:$name".nl."phone:$phone".nl.
"address:$address".nl.
"email: $email".nl.
"work: $work".nl.
"country: $country".nl
);
?>
正则表达式的内容非常复杂,难度也比较难,大家可以登录网站www.phpchina.com的论坛逐步提高自己的编程水平,也可以登录www.php.net进一步地学习。
习题:
1.简单叙述正则表达式的用途。
2.正则表达式“^[a-z][0-9]$”与下列哪个字符串匹配?
A.abc3
B.5b
C.ef5
D.b9
3.以下程序横线处应该使用的函数为:
$url = “欢迎访问 http://www.thizlinux.com.cn 站点. “;
$str = ___(“(http:W)([^ ]+)”, “\\2”,$url);
echo $str;
?>
输出结果为:
欢 迎 访 问
A.ereg
B.ereg_replace
C.preg_split
D.preg_replace
4.下面哪个正则表达式,可以从服务器上取到访问域名第二层?
A.preg_replace("/.*([^\.\/]+)(\.(com|net|org|gov|edu))?\.[^\.\/]+$/","\\1", $_SERVER['HTTP_HOST']);
B.preg_replace("/.*?([^\.\/]+)(\.(com|net|org|gov|edu))?\.[^\.\/]+$/","\\1", $_SERVER['HTTP_HOST']);
C.preg_replace("/.*([^\.\/]+)(\.(com|net|org|gov|edu))?\.[^\.\/]+$/", "\\1", $HTTP_HOST);
D.preg_replace("/.*?([^\.\/]+)(\.(com|net|org|gov|edu))?\.[^\.\/]+$/", "\\1", $HTTP_HOST);
5.定义一个电子邮件的正则表达式,并编写从一段包含电子邮件的网页代码中提取出电子邮件的功能的代码。
我们已经渐渐体会到变量在PHP中所扮演的角色。如果一个变量可以理解为包含单个值的容器,那么数组就是可以包含多个值的容器,每个值和一个索引相对应。
数组的概念:数组可以理解为有序的对(键—值)组成的数据值的集合。键也称为索引。
在严谨的语言中普通的数组的要求非常严格。例如,Java中的s(list除外)的索引必须是一个数字不允许是字符串,并且数组声明时必须确定数组中元素的个数。
同一数组中元素的数据类型必须一致,这样对于应用型程序设计(开发软件、系统)非常必要。
而PHP程序设计的要求是快速的开发基于B/S结构的网站,对于数据结构的要求比较松散,但是希望作为程序工程师的我们不要在思想上松散下去,要明确数组创建的目的,存储的数据类型,以便我们养成严谨的思想。
根据索引值不同,数组分为两类:索引数组,索引为整数的数组,默认索引值为零,依次递增;关联数组,索引中包含字符串的数组。
数组的初始化赋值也有两种方式:一是对数组变量赋值初始化数组;二是使用array( )函数初始化数组。
思考下面的程序:提示默认索引值为零,索引变化的原则是依次递增原则。
<
$number[ ]= "zero";
$number[ ]= "one";
echo $number[0];
//程序输出的值是多少?
?>
程序执行的结果:zero
$num[-10]= "1";
$num[0 ]= "2";
$num[20]= "3";
$num[21]= "4";
echo $num[0];
echo $num=[21];
?>
程序执行的结果:2 4
但是比较常用的初始化数组的方法是使用array( )函数初始化数组,array( )函数的括号中是数组的索引和值。
$num = array(“0”, “1”, “2”, “3”, “4” ,“5”, “6”);
echo $num[0]; //数组num索引0,对应的值为0。
echo $num[6]; //数组num索引6,对应的值为6。
?>
如果我们希望指定索引,可以使用 => 操作符给元素安排指定的索引。
例如:
$num = array(“p”, “7”=> “h”, “p”, “10”=>“like”);
echo $num[0];
echo $num[7];
echo $num[8];
cho $num[10];
?>
程序执行的结果:p h p like
我们可以使用array方便的定义数组,初始化数组。
上面我们操作的是索引数组,下面我们看看如何初始化关联数组。
$num = array(“China”, “B”=> “beijing”, “T”=> “tianjin”, “S”=> “shanghai”);
echo $num[0];
echo $num[“B”];
echo $num[“T”];
echo $num[“S”];
?>
程序执行结果:China beijing tianjian shanghai
如上,关联数组就是在索引值方面与索引数组不同,其索引值中包含了字符串,这样我们可以更方便地处理实际生活的问题,比如把我们的名字作为索引,我们的资料为索引的值,但是在操作数据时就需要比较复杂的方法,下面我们会讲解。
我们已经掌握如何去定义初始化一个数组,数组最有用的特征之一是可以遍历数组,并且在每个单独的元素上执行特定的操作。下面开始讲解数组的使用。
连续索引数组的遍历,由于数组的索引值是连续的整数,所以可以使用for循环来执行多次的重复取值处理。
但是我们必须知道数组中有多少个元素,我们无法每次都自己来数,有时数组是其他页面传递过来的,无法知道数组中元素的个数。
PHP提供了count( )函数取得数组与元素的个数,用循环语句操作数组:
$A = array("one","two","three","four");
$num=count($A);
for($i=0;$i< $num;$i++)
{
echo "$A[$i]"."
";
if($A[$i]= ="one")
{
unset($A[$i]);
}
}
?>
程序结果:
one
two
three
four
如果我们把count()函数直接放在for循环的条件上,会怎样?
$A = array("one","two","three","four");
for($i=0;$i< count($A);$i++)
{
echo "$A[$i]"."
";
if($A[$i]=="one")
{
unset($A[$i]);
}
}
?>
程序结果:
one
two
three
注意:尽量避免把count()函数放在循环体内。因为这样程序内部的操作可能导致条件的改变,会影响循环的结果。例如,我们使用函数unset析构变量(释放这个变量),那么数组的元素个数就会减小,count()函数执行的结果会发生变化,导致程序运行的结果与原先设想的不一致。如果我们用count函数得到一个确切的数值,放入循环的条件,那么这样就不会影响到我们的思路。
用函数遍历数组:无论我们学习什么函数,最关键的是明白如何使用系统提供的函数(函数的参数,函数的返回值),无论是面向过程的PHP 还是Java中的各种类库和方法。
用函数key()返回当前元素的索引。
用函数current()返回当前元素的值。
遍历数组:next()函数。
函数next把数组作为参数,返回当前元素值,数组元素后移,当到达数组最后一个元素后停止。注意:这样就表示了数组中元素出现零、内置常量false等情况程序会异常终止。
实例:next.php
$num=array("a","b","c","d","e");
do
{
$k=key($num); //返回当前元素的索引
$val=current($num); //返回当前元素的值
echo "\$num[$k]=$val"."
";
}
while(next($num)); //返回当前元素值,数组元素后移
?>
程序结果:
$num[0]=a
$num[1]=b
$num[2]=c
$num[3]=d
$num[4]=e
但是使用next函数存在一定的问题,例如:
$num=array("a","b",flase,"d","e"); //注意时false 与 “false”字符串不同,大家可以测试一下
do
{
$k=key($num);
$val=current($num);
echo "\$num[$k]=$val"."
";
}
while(next($num));
?>
程序的结果:
$num[0]=a
$num[1]=b
因为数组中元素为false 所以程序终止。
常用数组遍历函数:foreach(),list () each ()组合。foreach()遍历数组时首先对数组进行一份复制,之后对那份复制进行操作。list()each()的组合是直接操作数组本身,那么在数组内容大小不太大时,foreach安全可靠,因为它操作的是数组的一份复制,同时如果其他程序操作数组,那么不会出现协调性错误。
list()each()在操作数组时如果其他程序也在同时操作这个数组,那么结果会出现问题。但是在数组的元素很多的时候,foreach()还要复制一份后对数组再进行操作,会很消耗系统资源。具体的使用情况应该具体问题具体分析。
我们看一下foreach的结构:
格式1:foreach(array_expression as $value){ }。
格式2:foreach(array_expression as $key=>$value) { }。
程序如下:
foreach.php
$a=array(one=>"first",two=>"second",three=>"third");
foreach($a as $value) // $value变量名字可以随意合法设置
{
echo "$value".""; //我们不但可以输出,也可以进行其他操作。
}
?>
foreach($a as $key => $value)
{
echo "\$a[$key]=>$value"."";
}
?>
程序结果:
list()each()函数组合遍历数组。首先 each()函数把数组作为函数的参数,函数会返回当前数组元素的索引和值,并把数组当前活动元素向前移动一位,返回4个元素的数组,这个数组的索引为固定的4个值,分别是:0、1、key、value数组的值对应为参数数组的健和值。
list()是PHP语言的一个结构,把一个数组元素的值赋给指定变量。reset()函数将array的内部指针倒回到第一个单元并返回第一个数组单元的值,如果数组为空则返回FALSE。下面我们用实例来讲解。
例如:list-each.php
$num=array(
"ca"=>"china",
"un"=>"USA",
"ge"=>"german",
"en"=>"english"
);
$num1=each($num); //看看函数each()的返回结果是什么?
foreach($num1 as $k=>$v)
{
echo "\$num1[$k]=$v".""; //系统提供了数组的默认索引 1 value 0 key
}
reset($num); //还原数组
list($k,$v)=each($num); //察看list 函数的作用
echo "
";
echo "$k=>$v"; //输出list () 函数中的参数
?>
程序结果:
已经明白了list()each()函数的作用,我们需要用一个循环语句来遍历数组。
实例:list.php
$array=array("ca"=>"China","en"=>"England","ua"=>"USA");
while(list($k,$v)=each($array))
{
echo "\$array[$k]=>$v"."";
}
?>
我们已经掌握了字符串的基本使用方法和函数,如果需要对字符串和数组进行转换,那么需要使用函数:explode()函数和implode()函数。
explode(标志,sting , number);:把字符串string按照标志组成数组,达到number后作为数组最后一个元素。
Implode(参数,array)
把数组中的元素组成一个字符串,用参数连接。
实例:explode.php
$a="linux&apache&mysql&php";
$array=explode('&',$a,3); //把字符串$a 转化为3个元素的数组
foreach($array as $key=> $value)
{
echo "$key => $value"."";
}
$array=array("php","mysql","apache","linux");
foreach($array as $key=> $value)
{
echo "$key => $value"."";
}
$b=implode('+',$array);
echo "$b".""; 把数组中的元素转换为字符串
?>
程序结果:
数组可以理解为包含多个值的容器,那么数组的值也可以是数组,这就产生了二维数组,如果大家有兴趣可以模仿编写多维数组的程序。要注意的是,如何操作遍历多维数组。
实例:array.php
$computer = array(
"Linux"=> array("beauty"=>"Suse","good"=>"Redhat","pop"=>"Ubuntu"),
"LAMP"=> array("my"=>"linux","like"=>"apache","is"=>"mysql","PHPChina"=>"php"),
"CPU"=> array("speed"=>"AMD","money"=>"Intel")
);
foreach($computer as $key=> $value)
{
echo "$key"."
";
foreach($value as $keys=> $values)
{
echo "----$keys=>"."$values"."";
}
}
?>
程序结果:
按照数组的索引值排序,用函数ksort()按照数组的索引进行排序。
$a=array("a"=>"abc","b"=>"bcd","A"=>"cde");
while(list($k,$v)=each($a))
{
echo "\$a[$k]=>$v"."
";
}
echo "
";
ksort($a);
foreach($a as $key=> $value)
{
echo "\$a[$key] = $value"."
";
}
?>
程序结果:
前面的ksort()函数是对数组的索引进行排序,如果我们需要对数组中的数据进行比较排序,可以使用函数sort() asort()。
sort()函数按照数组元素的值进行排序。排序规则:按照先数字后字母排序,排序后数组的索引重新设置。
asort()函数功能与sort()类似,但是在数组排序后,索引不变,asort完整地保存了数组中索引值的关联信息。
实例:asort.php
$count=array("cn"=>"CHINA",
"un"=>"usa",
"ca"=>"canada",
"de"=>"germany",
"en"=>"english");
foreach($count as $key => $val)
{
echo "\$count[$key]=>$val"."";
}
echo "--------------"."";
sort($count);
foreach($count as $k => $v)
{
echo "\$count[$k]=>$v"."";
}
echo "--------------"."";
$count=array("cn"=>"CHINA",
"un"=>"usa",
"ca"=>"canada",
"de"=>"germany",
"en"=>"english");
asort($count);
foreach($count as $key => $val)
{
echo "\$count[$key]=>$val".""; //注意排序后的数组的索引值
}
?>
程序结果:
我们使用数组的目的是为了解决实际中的问题,如果一个管理小区的软件,我们必须把小区中的数据存储在程序中,如果我们使用字符串,那样我们不能简单地建立起相关数据的联系,所以我们可以使用数组,把数据存储在数组中的元素中,可以通过索引把众多的字符串联系起来。
可以利用系统提供的函数进行排序等处理。如果需要把元素插入到数组中,那么可以使用函数array_splice()实现元素的插入删除。
函数原形:
array_splice($a,num1,num2,$c);
$a=array(one=>"first",two=>"second",three=>"third" );
$c=array(hello=>"linux",happy=>"computer");
把$c中的元素插入到$a中,从$a中的num1位置删除num2个元素。如果num2为零直接插入;如果num1为正,从头开始偏移,num1为负,从尾偏移;当$c插入到$a后的索引值为数字,顺序显示。$a数组会根据插入的$c实际情况增长或缩短自身。如果无法理解,下面我们通过程序讲解。
实例:array_splice.php
$array1=array("a","b","c","d","e");
$key=key($array1);
$value=current($array1);
while(list($key,$value) = each($array1))
{
echo "\$array1[$key]=>$value"."";
}
echo "----------------------------"."";
$array2=array("A","B","C");
$key=key($array2);
$value=current($array2);
while(list($key,$value) = each($array2))
{
echo "\$array2[$key]=>$value"."";
}
echo "----------------------------"."";
$array=array_splice($array1,1,7,$array2);
foreach($array as $key => $value)
{
echo "\$array[$key]=>$value"."";
}
echo "----------------------------"."";
foreach($array1 as $key => $value)
{
echo "\$array1[$key]=>$value"."";
}
?>
程序结果:
$array1[0]=>a
$array1[1]=>b
$array1[2]=>c
$array1[3]=>d
$array1[4]=>e
----------------------------
$array2[0]=>A
$array2[1]=>B
$array2[2]=>C
----------------------------
$array[0]=>b
$array[1]=>c
$array[2]=>d
$array[3]=>e
----------------------------
$array1[0]=>a
$array1[1]=>A
$array1[2]=>B
$array1[3]=>C
1.新建一个数组的函数为:
A.array
B.next
C.count
D.reset
2.下列说法正确的是:
A.数组的下标必须为数字,且从“0”开始
B.数组的下标可以是字符串
C.数组中的元素类型必须一致
D.数组的下标必须是连续的
3.以下代码运行结果为:
$A=array("Monday","Tuesday",3=>"Wednesday");
echo $A[2];
?>
A.Monday
B.Tuesday
C.Wednesday
D.没有显示
4.以下程序运行后的结果为:
$A = ("a"=>123,"b"=>234,"c"=>345);
for ($i=0;$i
echo $A[$i] . " ";
}
?>
A 打印3个空格
B 123 234 345
C 提示错误
D (打印6个 )
5.以下程序运行结果为:
$A=array_fill(-5,3,"Hello");
for ($i=0; $i<5; $i++){
echo "\$A[$i] = ".$A[$i]." ";
}
?>
A $A[0] = Hello $A[1] = Hello $A[2] = $A[3] = $A[4] =
B $A[0] = Hello $A[1] = Hello $A[2] = Hello $A[3] = $A[4] =
C $A[0] = $A[1] = $A[2] = $A[3] = $A[4] =
D 程序运行提示错误
文件操作函数包括文件的打开、读取、写入等操作,下面分别介绍。
当处理文件时,你会利用到PHP丰富的和功能强大的文件函数库。首先需要打开文件,获得该文件的句柄资源。函数为fopen():
$handle = fopen('/path/to/file.txt', 'r');
上面fopen()函数的第一个参数是要打开文件名称。这个文件既可以是本地文件,又可以是远程网络文件,可以使用http、ftp等协议访问到的都可以打开。既可以使用绝对路径,也可以使用相对路径。例如:
$handle = fopen("/home/rasmus/file.txt", "r");
$handle = fopen("./file.gif", "wb");
$handle = fopen("http://www.example.com/", "r");
$handle = fopen("ftp://user:password@example.com/somefile.txt", "w");
?>
第二个参数是打开模式。打开模式主要有以下几种,如表10-1所示。
表10-1 文件打开模式
注意:r+模式与w+模式都可进行文件的读写操作,但他们确有着很大的区别:
(1)如果要操作的文件不存在,w+将尝试创建一个空文件,而r+将报错。
(2)用w+打开时,文件的原有数据将全部丢失,而r+会保留原数据等待读取。
$handle = fopen('/path/to/file.txt', 'r');当中,$handle就是得值就是属于文件的resource数据类型。打开文件以后,对文件的操作都将通过这个resource数据来实现。
进行文件读取操作,可以使用fread()函数:
$file = '/path/to/file.txt';
$handle = fopen($file, 'r');
$text = fread($handle, filesize($file));
fclose($handle); //关闭资源
fread()函数的第一个参数是已打开的文件资源,第二个参数是要读出的长度。上例中使用filesize()函数得到指定文件的总长度,可以每次读取一个片段:
$handle = fopen('/path/to/file.txt', 'r');
$contents = '';
while (!feof($handle)) //察看此时文件操作是否到达末尾,如果是返回true,否则返回false
{
$contents .= fread($handle, 1024);
}
fclose($handle);
fgets() 是另一个读取文件的有用函数。语法与 fread()一样,但是fgets()碰到了换行或者是到了文件尾部会停止读取。这在每次处理一行文件的时候非常有用。
$file = 'students.txt';
$students = array();
$handle = fopen($file, 'r');
while (!feof($handle))
{
$students[] = fgets($handle, 4096);
}
fclose($handle);
一种最常用的读取文件的方式是使用file()函数。这个函数返回一个数组,在数组中每个元素就是文件中的一行。它也不需要文件操作,所以不需要操心去打开和关闭文件。
// 将一个文件读入数组。本例中通过HTTP从URL中取得HTML源文件。
$lines = file('http://www.example.com/');
// 在数组中循环,显示HTML的源文件并加上行号。
foreach ($lines as $line_num => $line) {
echo "Line #{$line_num} : " . htmlspecialchars($line) . "
\n";
}
// 另一个例子将Web页面读入字符串。参见file_get_contents()。
$html = implode('', file ('http://www.example.com/'));
?>
另外还有一个readfile()函数,它的作用是读取一个文件,并直接将它的内容输出。它与file函数一样,也不用进行文件打开、关闭的操作,是一个独立的文件应用。
当熟悉了读取文件的时候,写入文件就非常容易懂了。但是当打开文件的时候,需要使用如w(write)或者a(append)之类的模式:
$handle = fopen('/path/to/file.txt', 'w');
fwrite()函数对每次写入一行非常有用。你可以提供的第二个参数是将要写入的字符串:
$filename = 'test.txt';
$somecontent = "添加这些文字到文件\n";
// 首先我们要确定文件存在并且可写。
if (is_writable($filename)) {
// 在这个例子里,我们将使用添加模式打开$filename,
// 因此,文件指针将会在文件的开头,
// 那就是当我们使用fwrite()的时候,$somecontent将要写入的地方。
if (!$handle = fopen($filename, 'a')) {
echo "不能打开文件 $filename";
exit;
}
// 将$somecontent写入到我们打开的文件中。
if (fwrite($handle, $somecontent) === FALSE) {
echo "不能写入到文件 $filename";
exit;
}
echo"成功地将$somecontent写入到文件$filename";
fclose($handle);
} else {
echo"文件$filename不可写";
}
?>
通过fclose函数可以方便地关闭文件,同样关闭文件还是操作的资源数据。比如:
fclose($handle);
(1)file-get-contents()和file-put-contents():为了更简易化,PHP5提供了file_get_contents()和file_put_contents()。这两个函数能做所有必须的工作,包括打开和关闭文件。file_get_contents()只需要文件名,例如:
$contents = file_get_contents('/path/to/file.txt');
file-get-contents工作起来很像file(),除了整个文件参数只是一个简单的字符串而不是一个数组。
如果用file(),就需要implode数组:
$contents = implode('', $lines);
file_put_contents() 也很管用,没有比用它更方便地写入文件的方式了:
file_put_contents('/path/to/file.txt', $contents);
这段程序读取$contents的内容,并把它写入文件file.txt。
注意事项:对文件操作应该注意文件、目录的权限,是否有权创建文件,尤其是Linux系统。
(2)bool copy ( string source, string dest ):将文件从source复制到dest。如果成功则返回 TRUE,失败则返回FALSE。
$file = 'example.txt';
$newfile = 'example.txt.bak';
ifc!copy($file, $newfile)) {
echo "failed to copy $file...\n";
}
?>
(3)string dirname ( string path ):给出一个包含有指向一个文件的全路径的字符串,本函数返回去掉文件名后的目录名。
在Windows中,斜线(/)和反斜线(\)都可以用作目录分隔符。在其他环境下是斜线(/)。
$path = "/etc/passwd";
$file = dirname($path); // $file is set to "/etc"
?>
(4)bool feof ( resource handle ):如果文件指针到了EOF或者出错时则返回TRUE,否则返回一个错误(包括socket超时),其他情况则返回FALSE。
(5)bool file_exists ( string filename ):如果由 filename 指定的文件或目录存在则返回TRUE,否则返回FALSE。
$filename = '/path/to/foo.txt';
if (file_exists($filename)) {
echo "The file $filename exists";
} else {
echo "The file $filename does not exist";
}
?>
注意:本函数的结果会被缓存。
(6)int filesize ( string filename ):返回文件大小的字节数,如果出错返回FALSE(在错误报告级别为 E_WARNING的情况下)。
注意:本函数的结果会被缓存。
(7)int fseek ( resource handle, int offset [, int whence] ):在与handle关联的文件中设定文件指针位置。新位置,从文件头开始以字节数度量,是以whence指定的位置加上 offset。whence 的值定义为:
SEEK_SET——设定位置等于offset字节。
SEEK_CUR——设定位置为当前位置加上offset。
SEEK_END——设定位置为文件尾加上offset。(要移动到文件尾之前的位置,需要给 offset 传递一个负值。)
如果没有指定 whence,默认为SEEK_SET。成功则返回0,否则返回-1。注意移动到EOF之后的位置不算错误。
$fp = fopen('somefile.txt');
// read some data
$data = fgets($fp, 4096);
// move back to the begining of the file
// same as rewind($fp);
fseek($fp, 0);
?>
bool rewind ( resource handle )
将handle的文件位置指针设为文件流的开头。如果成功则返回TRUE,失败则返回FALSE。文件指针必须合法,并且指向由fopen()成功打开的文件。
下面列出文件操作的几个典型应用场景。
实例:php-result-1.php
$A="test1.txt";
$B=file($A);
for($i=0;$i
echo $B[$i]."";
?>
用函数file打开文件test1.txt ,输出。
实例:php-result-2 .php……打开文件test 1.txt,输出。
实例:php-result-3.php
$A=$_POST['write'];
$B=fopen("test1.txt","a+");
$C=fwrite($B,$A);
fclose($B);
$D=file("test1.txt");
for($i=0;$i
echo $D[$i]."";
?>
使用函数fwrite写入文件。
实例:php-result-4.php
$A="test1.txt";
if(file_exists($A))
{
echo "文件存在"."";
}
else
{
echo "文件不存在";
}
echo "文件的大小是:".filesize($A)."";
echo "文件创建时间是:".date("Y年m月j日",filectime($A))."";
echo "文件最后变动的时间是:".date("Y年m月j日",filemtime($A))."";
echo "文件最后打开的时间是:".date("Y年m月j日",fileatime($A))."";
?>
测试文件
实例:php-result-5.php
$A=fopen("test1.txt","r+");
rewind($A);
$B=ftell($A);
echo "$B"."";
if(!feof($A)) //文件操作是否在结尾,在结尾返回true,否则返回false;
{
echo "文件资料指针,移到文件开始";
}
else
{
echo "文件资料指针,在文件结尾";
}
?>
实例:php-result-6.php
$count="counte.txt";
$fop=fopen($count,"w+");
$num=file($count);
if($num!==0)
{
$num=0;
}
else
{
echo "已经初始化";
}
header("location:php-file.php");//自动跳转
?>
页面作用,记录访问页面的次数
PHP提供了众多的文件处理函数,但是操作数据的根本还是字符串和数组,能否顺利地使用这些函数灵活地操作,需要积累和练习。
后面的课程我们会讲解文件上传,同样也是使用到大量的函数,联系本课内容能够实现比较强大的功能,因为数据不会在页面关闭后丢失,会存储在指定的文件中,我们利用字符串函数、数组函数的操作实现类似数据库的功能。
无论是C语言、Java程序设计,还是PHP各种语言的区别是如何表示、存储数据。不同的语言提供了不同的方法或函数。但是在最根本的算法上还是需要程序员的不断地练习和开发实践才能够提升自己的能力。
不同的程序语言中,数组的根本思想是一致的,我们要考虑的是在这种语言中如何表示、如何操作、提供了什么方法。
如同学习交流语言一样,我们在用中文交谈或者用英文交谈,语言只是一个表达的工具。我们表达出的思想才是我们所特有的。我们如何归纳思想、表达语义,也就是说无论是中国的唐诗、宋词还是英文的诗歌,最关键的是它的表述模式和核心思想。
我们学习数组,学习PHP程序设计的最终目的是为了把我们的思想用程序表达出来,希望大家勇敢地练习,编写自己的程序。
习题:
1.file()函数返回的数据类型为:
A.数组
B.字符串
C.整型
D.根据文件来定
2.$a="abc";
$b=count($a);
则$b等于:
A.1
B.3
C.0
D.报错
3.怎样打开或创建一个文件:
A.open()
B.fopen()
C.fwrite()
D.write()
4.以下代码运行结果:
$fp = fopen("/etc/passwd", "r");
$data = fgets($fp, 12);
echo ftell($fp);
fclose($fp);
?>
A 13 B 11 C 0 D 10
5.假设服务器中有一文件data,属性为可读写,内容为:
Hello
php
Hellolinux
$filename = "data";
$fopen = fopen($filename,w+);
fwrite($fopen,"Hello World");
?>
请问执行以上代码后data文件内容为:
A.Hello
B.Hello World
C.Hello
php
Hellolinux
D.空
10.5 图像
在使用基本的图像创建函数之前,需要安装GD库文件。如果要使用与JPEG有关的图像创建函数,还需要安装jpeg-6b,如果要在图像中使用Type 1型字体,则必须安装t1lib。
在建立图像创建环境之前,还需要做一些准备工作。首先安装t1lib,接着安装jpeg-6b,然后再安装GD库文件。在安装时一定要按这里给定的顺序进行安装,因为在编译GD入库时会用到jpeg-6b,如果没有安装jpeg-6b,在编译时就会出错。
在安装完这三个组件后,还需要重新配置一次PHP,这也是你对采用DSO方式安装PHP感到庆幸的地方之一。运行make clean,然后在当前的配置中添加下面的内容:
--with-gd=[/path/to/gd]
--with-jpeg-dir=[/path/to/jpeg-6b]
--with-t1lib=[/path/to/t1lib]
完成添加后执行make命令,然后再执行make install命令,重新启动Apache后运行phpinfo()来检查一下新的设置是否生效了。现在,我们就可以开始图像创建工作了。
根据所安装的GD库文件的版本将决定你是否能创建GIF或PNG格式的图形文件。如果安装的是gd-1.6或以前的版本,可以使用GIF格式的文件但不能创建PNG格式,如果安装的是gd-1.6以后的版本,可以创建PNG文件但不能创建GIF格式的文件。
PHP中有一组图像函数,可以动态生成gif格式的图像数据流并输出到服务器。为了这组函数能够工作,系统中必须有gd库的支持。如果是在UNIX下,应该在编译PHP之前先取得gd的源码并编译之,生成libgd.a和一些.h文件,分别复制到系统的库目录和头文件目录中(例如/usr/lib和/usr/include);如果是在Windows下,PHP3.0的安装程序会安装一个gd.dll文件,在程序中加一句'dl ("gd.dll");'即可使用图像函数。
主要的图像函数有以下几个。
(1)ImageCreate(宽度,高度):返回一个图像描述符。
(2)ImageCreateFromGif(文件名):返回一个图像描述符。
(3)ImageColorAllocate(图像描述符,红,绿,蓝):返回一个颜色描述符。由于Gif图像只能有256色,必须先对它分配调色板,这个语句就是分配一个调色板项。
(4)ImageColorTransparent(图像描述符,颜色描述符):指定某颜色为透明色。
(5)ImageArc(图像描述符,圆心横坐标,圆心纵坐标,椭圆宽,椭圆高,起始角,终止角,颜色描述符);
ImageChar(图像描述符,字体,x,y,字符,颜色描述符);
ImageCharUp(图像描述符,字体,x,y,字符,颜色描述符);
ImageCopyResized(目标图像描述符,源图像描述符,目标x,目标y,源x,源y,目标宽,目标高,源宽,源高);
ImageDashedLine(图像描述符,x1,y1,x2,y2,颜色描述符);
ImageFill(图像描述符,起始点x,起始点y,颜色描述符);
ImageFilledPolygon(图像描述符,各顶点数组,顶点数,颜色描述符);
ImageFilledRectangle(图像描述符,x1,y1,x2,y2,颜色描述符);
ImageFillToBorder(图像描述符,起始点x,起始点y,边界色,填充色);
ImageLine(图像描述符,x1,y1,x2,y2,颜色描述符);
ImagePolygon(图像描述符,各顶点数组,顶点数,颜色描述符);
ImageRectangle(图像描述符,x1,y1,x2,y2,颜色描述符);
ImageSetPixel(图像描述符,x,y,颜色描述符);
ImageString(图像描述符,字体,x,y,字符串,颜色描述符);
ImageStringUp(图像描述符,字体,x,y,字符串,颜色描述符);
这些都是画图函数,需要略做解释的就是多边形的顶点数组内依次存放着第一点x,第一点y,第二点x,第二点y,...
(6)ImageLoadFont(文件名):文件应该是一个位图字体文件,返回一个字体号。系统默认带有1~5号字体,可以直接使用。
(7)ImageSX,ImageSY:分别得到一个图像的宽度和高度,接收一个图像描述符参数。
(8)ImageColorAt(图像描述符,x,y);
ImageColorClosest(图像描述符,红,绿,蓝);
ImageColorExact(图像描述符,红,绿,蓝);
ImageColorSet(图像描述符,颜色描述符,红,绿,蓝);
ImageColorsForIndex(图像描述符,颜色描述符);
ImageColorsTotal(图像描述符);
前三个返回一个颜色描述符。ImageColorExact如果找不到匹配则返回-1。ImageColorsForIndex返回一个三项的数组,元素分别是红,绿,蓝值。ImageColorsTotal返回总颜色数。
(9)ImageFontHeight,ImageFontWidth:接收一个字体号作为参数。
(10)ImageGif(图像描述符,[文件名]):如无文件名,则将gif数据流送往浏览器。这时程序一开始应该有一句:Header("Content-type: image/gif")。
(11)ImageDestroy(图像描述符):图像函数中有一个小Bug(至少在PHP3.0RC和PHP3.0RC3 For UNIX的源码中已经发现,现在www.php.net上的下载文件应该已经更改),就是ImageSetPixel总是在(y,y)处画点,不管x的值是什么,不过这个问题不是很大。
在下面的例子中,我们将创建一个PNG格式的图像文件,下面的代码是一个包含所创建的图像的MIME类型的头部:
<? header ("Content-type: image/png");
使用ImageCreate()创建一个代表空白图像的变量,这个函数要求以像素为单位的图像大小的参数,其格式是ImageCreate(x_size, y_size)。如果要创建一个大小为250×250的图像,就可以使用下面的语句:
$newImg = ImageCreate(250,250);
由于图像还是空白的,因此你可能会希望用一些彩色来填充它。你需要首先使用ImageColorAllocate()函数用其RGB值为这种颜色指定一个名字,这一函数的格式为ImageColorAllocate([image], [red], [green], [blue])。如果要定义天蓝色,可以使用如下的语句:
$skyblue = ImageColorAllocate($newImg,136,193,255);
接下来,需要使用ImageFill()函数用这种颜色填充这个图像,ImageFill()函数有几个版本,如ImageFillRectangle()、ImageFillPolygon()等。为简单起见,我们通过如下的格式使用ImageFill()函数:
ImageFill([image],[start x point], [start y point], [color])
ImageFill($newImg,0,0,$skyblue);
最后,在图像建立后释放图像句柄和所占用的内存:
ImagePNG($newImg);
ImageDestroy($newImg); ?>
这样,创建图像的全部代码如下所示:
<? header ("Content-type: image/png");
$newImg = ImageCreate(250,250);
$skyblue = ImageColorAllocate($newImg,136,193,255);
ImageFill($newImg,0,0,$skyblue);
ImagePNG($newImg);
ImageDestroy($newImg);
?>
如果把这个脚本文件保存为skyblue.php,并用浏览器访问它,我们会看到一个天蓝色的250×250的PNG格式的图像。
我们还可以使用图像创建函数对图像进行处理,如把一个较大图像做成一个小图像。
假设你有一幅图像,想从中裁剪出一个35×35大小的图像。你所需要做的是创建一个35×35大小的空白图像,创建一个包含原来图像的图像流,然后把一个经过调整大小的原来的图像放到新的空白图像中。
要完成这一任务的关键函数是ImageCopyResized(),它要求的格式如下所示:
ImageCopyResized([new image handle],[original image handle],[new image X], [new Image Y], [original image X], [original image Y], [new image X], [new image Y], [original image X], [original image Y])。
<? /* 发送一个头部,以便让浏览器知道该文件所包含的内容类型*/
header("Content-type: image/png");
/* 建立保存新图像高度和宽度的变量*/
$newWidth = 35;
$newHeight = 35;
/* 建立给定高度和宽度的新的空白图像*/
$newImg = ImageCreate($newWidth,$newHeight);
/* 从原来较大的图像中得到数据*/
$origImg = ImageCreateFromPNG("test.png");
/*复制调整大小后的图像,使用ImageSX()、ImageSY()得到原来的图像在X、Y方面上大小*/
ImageCopyResized($newImg,$origImg,0,0,0,0,$newWidth,$newHeight,ImageSX($origImg),ImageSY($origImg));
/*创建希望得到的图像,释放内存 */
ImagePNG($newImg);
ImageDestroy($newImg); ?>
如果把这一小段脚本保存为resized.php,然后用浏览器对它进行访问,就会看到一个35×35大小的PNG格式的图像。
习题:
请开发一个页面,实现图片校验功能,即要求用户在校验框中输入的文字与图片中显示的一致,否则报错。校验图片包含有随机生成的字母数字,并有一些随机划线噪音。如果用户看不清楚,单击图片重新生成一张新的校验图片。
本章总结
本章主要对PHP中的常用函数、正则表达试、数组、文件和图象做了详细讲解,这些要点在PHP开发中有着极其重要的地位,是深入学习PHP和熟练开发的基础。