PHP这门编程语言最开始的时候起源于1995年,一个名叫Rasmus Lerdorf的程序员开发了一个用Perl/CGI脚本编写的在线简历,这个脚本的作用是用来将访问这个在线简历的人员的信息写入日志(通过日志可以查看很多计算机当中的信息。)同时还能够显示这个网页访问者的数量(也就是提示你有多少人亲睐你的这一份在线简历。)。PHP(Personal Home Page个人主页)就是这样起源的,1997年11月发行了PHP 2.0,PHP其实从3.0版本开始全称正式改为PHP:超文本预处理器(PHP:Hypertext Preprocessor),PHP本来就可以用记事本这个程序来写,来阅读。没想到到发行3.0版本为止,已经有超过5万个用户在使用PHP改进其网页。其实,PHP不仅仅只是用来处理网页,在网站的开发过程中,使用PHP这一门语言的优势一直都很明显,而且,从未轻易改变和放弃过。到1999年初,两位核心开发人员(Zeev Suraski和Andi Gutmans)最终改写了PHP的解析器(也就是将PHP的代码解析为PHP网页),也就是所谓的Zend脚本引擎,这些工作最终导致了PHP4的发布。Zend是关于开发,部署和管理PHP应用的产品和服务的主要提供商。
PHP4添加了以下几项对该语言,对企业级应用来说的改进工作。
1:改进了资源处理,开始有很多企业尝试用PHP开发企业级网站。
2:面向对象的支持。其实所谓的对象,也就是现实世界中的所有东西。
3:内置的会话处理支持,这个特性使得开发人员可以相当高效率地跟踪用户活动和偏好。其实会话就相当于一次谈话,通过这次谈话,能够实现用户你愿意尝试做到的很多件事。
4:加密。亲密的人们之间都有着特定的语言来沟通,其他人是无法了解的。
5:ISAPI支持。能够将PHP与微软的IIS Web服务器结合使用。
6:内置COM/DCOM支持。其实这项功能也就是扩展了PHP与Windows应用程序的互操作性。
7:内置Java支持。PHP的应用程序能够绑定Java对象。
8:与Perl兼容的正则表达式(PCRE)库。
版本5是PHP语言发展历程中的另一座分水岭。
1. 极大地提高了面向对象能力。
2. try/catch异常处理。(try尝试/catch捕获)
3. 改进的XML和Web服务支持。
4. 对SQLite的内置支持。
PHP6的关键特性。
1. Unicode支持。(为了构建和维护多种语言的应用程序。)
2. 安全改进。
3. 新语言特性和构造。
全部的Apache安装中有40%都安装有PHP。说明PHP确实够流行,够疯狂。
1.September 23.2007的格式输出当前日期:
<?php echo date(“F j,Y”);?>
F代表月份,j代表日期,Y代表年份。
2.生成一个由5个字母或数字字符组成的字符串,如a3jh8:
$randomString=substr(md5(microtime(),0,5);
substr取字符串函数,md5加密函数。microtime(),返回当前时间的微秒数。
3<?php
$number=”5”; //$number是一个字符串。
$sum=15+$number;//添加一个整型和字符串用于生产出一个整型。
$sum=”twenty”; /将$sum覆盖为一个字符串。
?>
PHP为25种以上的数据库产品提供了内置支持。
因为PHP开源软件(源代码可以供所有人共享,修改的软件)的出现,它和因特网就像面包和黄油一样密不可分。
PHP的优点之一是可以把PHP代码直接嵌入到HTML页面中。
Welcomeh3是html中标题的意思。
<?php <?php ?> 是PHP代码的开始和结束符。
echo “
Some dynamic output here
”;是html中段落的意思。
?> echo打印输出的意思。
Some static output here
PHP还可以使用更短的界定(php语句跟html分离时候的标识。也就是你html显示你的,我php实现我的功能。)语法,也就是<? ?>,但是,要使用这个特性,需要启用PHP的short_open_tag指令。
PHP还支持另一种主流的界定形式,也就是类似于javascript这种显示风格的样子,
<script language=”php”> 先声明这个脚本使用的是php语言
print “This is another PHP example.”; print打印输出
</script>
Microsoft ASP以<%开头,以%>结束。PHP也同样支持这种显示的方式。
<%
print “This is another PHP example.”;
%>
但是从PHP6开始ASP风格的语法就被删去了。就像过气的明星被雪藏是一样的道理。
<html> html的开头标记
<head> 在<head></head>之内的,是head信息,head信息在浏览器浏览页面的时候是看不到的。
<title> html标题
<?php echo “Welcome to my Website”;?> </title>
</head>
<body> html文档主体
<?php
$date=”July 26,2007”; 声明一个变量$date
?>
Today’s date is<?=$date;?>
在<?= ?>中使用这个变量$date</body>
</html>
当然,写PHP代码时,要为代码添加充分的注释。其实是为了方便以后的继续使用,继续修改。
PHP支持C++的单行注释语法,以双斜线(//)开头。
<?php
//Title: My first PHP script
//Author: Jason
echo “This is a PHP program”;
?>
PHP还支持另一种C++风格的单行语法,称为shell语法,它以#符号开头。
<?php
#Title: My PHP program
#Author: Jason
echo “This is a PHP program”;
?>
phpDocumentor是一个促进文档处理的开源项目。它将嵌在源代码中的注释转换为各种易读的格式。包括HTML和PDF。
PHP还支持一种多行形式的注释,同时标注注释的开始和结束。
<?php
/*
Title:My PHP Program
Author:Jason
Date: July 26,2007
*/
?>
int print(argument) int返回的类型是整数型,argument是传入的参数。
<?php
print(“
I love the summertime.
”);?>
<?php
$season=”summertime”;
print “
I love the $season.
”;?>
<?php
print “
I love the summertime.
”;?>
以上这些语句都能够生成同样的输出如下,其实这三条语句本来就是差不多的,实现了一样的功能。
I love the summertime.
echo()能够输出多个字符串。
<?php
$heavyweight=”Lennox Lewis”;
$lightweight=”Floyd Mayweather”;
echo $heavyweight, “and”,$lightweight,”are great fighters.”;
?>
这个代码会生成以下输出:
Lennox Lewis and Floyd Mayweather are great fighters.
其实也就是通过echo语句将这几个变量中的字符串都合在一起打印输出了而已。
echo()和print()相比,echo()函数稍稍快一点,因为echo()函数什么都不返回,而print()不同,如果这个语句成功地输出,它会返回1。
printf()语句将静态数据和动态数据清晰地分至两个不同的部分,从而可以轻松地维护。
boolean printf(string format [,mixed args]) format是字符串类型的,args是混合类型的。
printf(“Bar inventory: %d bottles of tonic water.”,100);
执行这个命令会生成以下输出:
Bar inventory: 100 bottles of tonic water. (使用了printf函数后,%d其实被100给替换掉了。)
当然,printf()语句也可以同时传入两个值,就比如整数值和浮点数值,
printf(“%d bottles of tonic water cost $%f”, 100 , 43.20);
执行这个命令会生成以下输出:
100 bottles of tonic water cost $43.20 (%d被100给替换, %f被43.20替换)
处理小数值时,可以使用一个精度指示符调整精度,例如,
printf(“$%.2f”,43.2); // 显示为43.20
sprintf()函数的功能与printf()相同,但它将输出指派到字符串,而不是直接指派到浏览器,其形式如下,
string sprintf(string format[,mixed arguments])
$cost=sprintf(“$%.2f”,43.2); // $cost=$43.20 变量$cost最后指向到$43.20。
标量(scalar)数据类型的变量能够保存单项信息,以下都属于标量数据类型,布尔型,整型,浮点型和字符串型。
布尔变量(两种可能,要么是真实的,要么就是虚假的。)表示真实性,只支持两个值,TRUE(真)或FALSE(假),不区分大小写。另一方面,也可以使用0来表示FALSE,非0值表示TRUE。
$alive=false; //$alive is false.
$alive=1; // $alive is true.
$alive=-1; // $alive is true.
$alive=5; // $alive is true.
$alive=0; // $alive is false.
PHP支持以十进制数(基数为10),八进制数(基数为8)和十六进制数(基数为16)表示的整数值。
42 //decimal十进制
-678900 //decimal十进制
0755 //octal 八进制
0XC4E //hexadecimal 十六进制
浮点数,也称为双精度数(double)或实数(real number),可以指定包含小数部分的数,浮点数用于表示货币值,重量,距离,以及用简单的整数无法满足要求的其他表示。
字符串是一个连续的字符序列。这样的组通常用单引号或双引号来界定。
下面是一些有效的字符串例子:
“PHP is a great language”
“whoop-de-do”
‘*9subway\n’ (之所以用单引号就是代表按照原来的样子进行输出)
“123$%^789”
当然,也可以将字符串当作数组来访问和显示某个字符。
$color=”maroon”;
$parser=$color[2]; // 将$color中的第三个字符r赋值给$parser
复合数据类型可以用于将多个相同类型的项聚集起来,表示为一个实体。这包括数组(array)和对象(object)。
Array正式的定义是有索引的数据值集合。每个数组索引(也成为键(key))引用一个对应的值。索引其实就是一个简单的数,指示某个值在系列中的位置,也可以与值有某种直接关联。
例如,如果要创建美国各州的列表,可以使用数字索引的数组,如下:
$state[0]=”Alabama”;
$state[1]=”Alaska”;
$state[2]=”Arizona”;
...
$state[49]=”Wyoming”;
如果项目要求将美国各州与其州府相关联,这个时候使用关联索引。
$state[“Alabama”]=”Montomery”;
$state[“Alaska”]=”Juneau”;
$state[“Arizona”]=”Phoenix”;
...
$state[“Wyoming”]=”Cheyenne”;
在PHP中,对象这种数据类型必须显式地进行声明。(就像性格直接的人与人之间的交流是一样的,性格直接的人喜欢直来直去地说话。)
Class Appliance { 声明一个Appliance类
private $_power; 声明一个私有成员$_power
function setPower($status) { 声明一个setPower函数,传入$status参数
$this->_power=$status; $this指针将私有成员$_power指向变量$status
}
}
$blender=new Appliance; //声明$blender为Appliance类的新的对象。
可以使用方法setPower()来设置blender对象的power属性。
$blender->setPower(“on”);
例子,将一个整数转换为双精度数。
$score=(double)13; //这样一来$score就等于13.0
将一个双精度数强制转换为整数。
$score=(int)14.8 //$score=14
将一个字符串数据类型转换为一个整数。
$sentence=”This is a sentence”;
echo (int)$sentence; // 返回0
当将一个数据类型强制转换为数组中的一个成员时,所转换的值将成为数组中的第一个成员。(当品质极好的我强迫你跟我谈朋友的时候,你很快就会发现你是我的第一个女朋友。)
$score=1114;
$scoreboard=(array)$score;
echo $scoreboard[0]; //$scoreboard[0]输出的是数组scoreboard中的第一个成员,结果输出为1114
任何数据类型都可以转换为对象,结果是,该变量成为了对象的一个属性。该属性名为scalar:
$model=”Toyota”;
$obj=(object)$model;
然后可以如下引用这个值:
print $obj->scalar; //返回”Toyota”
当然,PHP有时候会将变量自动转换为最适合的类型。
<?php
$total=5; //一个整型
$count=”15”; //一个字符串
$total +=$count; //$total=20(这个时候$total就自动转换为整型了。$total+=$count相当于$total=$total+$count;
<?php
$total=”45 fire engines”;
$incoming=10;
$total=$incoming +$total;
?>
//$total最后就忽略了原来内容中的fire engines字符串,最后45加10等于55,$total最后的值就等于55了。(忽略了次要,最后收获了重要。)
<?php
$total=”1.0”;
If($total) echo “We’re in positive territory!”;
?>
在这个例子中,$total中的内容自动转换为布尔类型。
<?php
$val1=”1.2e3”; //1.2e3其实就是1200
$val2=2;
echo $val1*$val2; //输出2400
?>
string gettype(mixed var) gettype函数的返回值是字符串型,参数mixed var表示var变量可以是各种类型。
settype()函数将var指定的变量转换为type指定的类型。Type有7个可取值:array(数组型),boolean(布尔型),float(浮点型),integer(整型),null(空类型),object(对象型)和string(字符串型)。如果转换成功,则返回TRUE,如果失败,则返回FALSE。函数的形式为:
boolean settype(mixed var, string type) settype函数的返回值是boolean布尔型, 参数mixed var表示var变量可以是各种类型,string type是字符串型。
当然,也可以用很多函数来确定变量的类型,包括is_array()是否是数组,is_bool()是否是布尔型,is_float()是否是浮点型,is_integer()是否是整型,is_null()是否是空类型,is_numeric()是否是数字或数字字符串,is_object()是否是对象型,is_resource()是否是资源类型,is_scalar()是否是标量类型和is_string()是否是字符串类型。以上函数判断正确返回TRUE,判断错误返回FALSE。然后将它们合并为一个一般形式。
boolean is_name(mixed var)
举一个例子:
<?php
$item=43;
printf(“The variable \$item is of type array: %d <br/>”, is_array($item));//判断$item是否是数组型。其中的\是转义字符,\$item最后显示的时候是$item。
printf(“The variable \$item is of type integer:%d <br/>”, is_integer($item));
//判断$item是否是整型。
printf(“The variable \$item is numeric:%d <br/>”, is_numeric($item));
//判断$item是否是数值型。
?>
以上三行代码返回如下内容,其中0代表错误,1代表正确:
The variable $item is of type array:0
The variable $item is of type integer:1
The variable $item is numeric:1
比如This&that就是非法的标识符,因为this和that都是PHP中的预定义关键字。
变量是可以在不同时刻存储不同值的符号。变量总是以美元符$开头,然后是变量名。(我是不是可以理解为PHP其实很受那些财迷欢迎,都是美元嘛,这么多钱,哈哈。)变量名可以以字母或下划线开头,要由字母,下划线,数字或从127到255的其他ASCII字符组成。当然,变量也是区分大小写的。当然,所有的变量都应该在使用前进行声明,最好带有注释。(写代码的时候注释其实非常重要,方便以后的阅读和修改。)变量赋值有两种方法,值赋值和引用赋值。
值赋值
按值赋值就是将赋值表达式的值复制到变量。比如,
$color=”red”;
$number=12;
$age=12;
$sum=12+”15”; //$sum等于27
对于引用赋值而言,如果多个变量引用了同一个内容,修改其中任意一个变量,在其余的变量上都将有所反映。(你只要改变了我,你其实就已经相当于改变了跟我有关的很多人。)在等于号后面加一个&符号就可以完成引用赋值。
<?php
$value1=”Hello”;
$value2=& $value1; //$value1和$value2都等于”Hello”
$value2=”Goodbye”; //$value1和$value2都等于”Goodbye”
?>
PHP还支持另一种引用赋值语法,就是将&符号放在所引用变量的前面。
<?php
$value1=”Hello”;
$value2= &value1; //$value1和$value2都等于”Hello”
$value2=”Goodbye”; //$value1和$value2都等于”Goodbye”
?>其中注意了,$value2=& $value1;跟$value2= &value1;是不一样的。一个是等于号后面加上&,一个是变量前面加上了&。
PHP变量有4种作用域:
局部变量
函数参数
全局变量
静态变量
在函数中声明的变量称为是局部变量。其实也就是它只能够在函数中引用。(离开了函数,它就活不下去了。就像鱼脱离了水就会死是一样的道理。)
$x=4; //这里的$x其实就是一个全局变量
function assignx(){ //声明了一个assignx函数
$x=0; //这里的$x就是一个局部变量了,离开了这个函数,它其实就活不下去了。
printf(“\$x inside function is %d <br/>”,$x);
}
assignx(); 使用这个函数assignx()。
printf(“\$x outside of function is %d <br/>”,$x);
代码的执行结果为:
$x在函数内部为0
$x在函数外部为4,其实这个例子中外面的那个$x其实就等同于是全局变量了。
function x10($value){
$value=$value*10;
return $value;
}
在声明参数的函数内部可以访问和处理这些函数参数,但当函数执行结束时,参数就会撤销。
与局部变量相反,全局变量可以在程序的任何地方访问。只要在变量前面加上关键字GLOBAL,这样就可以将其识别为全局变量。(你在哪里都可以召唤我这个全部变量朋友哦。)
$somevar=15; 这里$somevar是局部变量
function addit(){
GLOBAL $somevar; 将$somevar重新声明为全局变量
$somevar++; $somevar自己增加1
echo “Somevar is $somevar”; 然后打印出来
}
addit(); 调用addit这个函数
$somevar最后显示的值是16.但是如果省略下面这行代码:
GLOBAL $somevar; 变量$somevar将赋值为1.因为$somevar在addit()函数中被认为是一个局部变量。
当然,也可以使用$GLOBALS数组将变量$somevar声明为全局变量。
$somevar=15;
function addit(){
$GLOBALS[“somevar”]++; 将somevar通过$GLOBALS数组声明为是全局变量。
}
addit();
echo “Somevar is “.$GLOBALS[“somevar”];
somevar的返回值就是16了。
静态变量在函数退出时不会丢失值,并且再次调用此函数时还能够保留这个值。(只要你对我这个静态变量朋友好,我就会一直记得你的好。而且会一直保留下去。)在变量名前面加上关键字STATIC就可以声明一个静态变量。
function keep_track(){
STATIC $count=0;
$count++;
echo $count;
echo “<br/>”;
}
keep_track();
keep_track();
keep_track();
因为$count是静态的,它会在每次执行函数时都会保留前面的值。所以输出如下:
1
2
3
echo “$var=> $value <br/>”;
}
显示用户的IP地址:
printf(“Your IP address:%s”,$_SERVER[‘REMOTE_ADDR’]);
这会返回一个数字型的IP地址,如192.0.34.166。
获得关于用户浏览器和操作系统的信息。
printf(“Your browser is:%s”,$_SERVER[‘HTTP_USER_AGENT’]);
要使用预定义变量数组,必须在php.int文件中启用配置参数track_vars。
$_SERVER[‘HTTP_REFERER’]。引导用户到达当前位置的页面的URL。
$_SERVER[‘REMOTE_ADDR’]。客户IP地址。
$_SERVER[‘REQUEST_URI’]。URL的路径部分。也就是如果URL是http://www.example.com/langlang/lang/index.html,那么URI就是langlang/lang/index.html。
$_SERVER[‘HTTP_USER_AGENT’],客户的用户代理,一般会提供操作系统和浏览器的有关信息。
$_GET[‘cat’]=”langlang”
$_GET[‘id’]=”188” 其实就是对应了URL地址中的cat=langlang和id=188。
$_POST超级全局变量包含用POST方法传递的参数的有关信息。
<form action=”subscribe.php” method=”post”> 将表单提交到subscribe.php页面,提交服务器的http方法是通过post表单的提交方式。post适用于大量数据的提交。
是HTML中的段落标签。
Email address:<br/> <br/>换行。
<input type=”text” name=”email” size=”20” maxlength=”50” value=””/>
text会产生一个文本框,文本框名称name是email,大小size为20,最大长度maxlength为50,value初始化值为空。
Password:<br/>
<input type=”password” name=”pswd” size=”20” maxlength=”15” value=””/>
password会产生一个密码文本框。密码文本框名称name为pswd,大小size为20,最大长度maxlength为15,初始化值value为空。
<input type=”submit” name=”subscribe” value=”subscribe!”/>
产生一个submit提交按钮,提交按钮名称为subscribe,提交按钮的显示值为subscribe!。
</form>
通过目标脚本subscribe.php,就可以使用下面的POST变量:
$_POST[‘email’]=”[email protected]”;
$_POST[‘pswd’]=”rainyday”;
$_POST[‘subscribe’]=”subscribe!”; 其中email,pswd,subscribe就是刚才那个脚本中name所指向的值。(你最开始在PHP脚本中给定了我最开始的name名称,所以,我很感谢你,你能够在$_POST中用到我。)
$FILES超级全局变量包含通过POST方法向服务器上传的数据的有关信息。
$FILES[‘upload-name’][‘name’]。从客户端向服务器上传文件的文件名。
$FILES[‘upload-name’][‘type’]。上传文件的MIME类型(MIME多用途互联网邮件扩展类型,也就是设定电脑里的某一个扩展名的文件,当访问的时候,浏览器会自动使用指定的应用程序来打开。指定的MIME类型,可以是applilcation应用,audio声音,image图片,text文本,video视频等等。总之MIME类型就像一个多面手一样,在默默地帮助你通过浏览器打开你电脑中的每一个文件。)。这个变量是否赋值取决于浏览器的功能。
$FILES[‘upload-name’][‘size’]。上传文件的大小(以字节为单位)。
$FILES[‘upload-name’][‘tmp_name’],上传之后,将此文件移到最终位置之前赋予的临时名。
$FILES[‘upload-name’][‘error’]。上传状态码,尽管这个变量名为error,但实际上在成功的情况下也会填写这个变量。它有5个可能的值。
UPLOAD_ERR_OK。文件成功上传。
UPLOAD_ERR_INI_SIZE. 文件大小超出了upload_max_filesize指令所指定的最大值。
UPLOAD_ERR_FORM_SIZE.文件大小超出了MAX_FILE_SIZE隐藏表单域参数(可选)指定的最大值。
UPLOAD_ERR_PARTIAL.文件只上传了一部分。
UPLOAD_ERR_NO_FILE.上传表单中没有指定文件。
$ENV超级全局变量提供PHP解析器所在服务器环境的有关信息。
$_ENV[‘HOSTNAME’]。服务器主机名。
$_ENV[‘SHELL’]。系统shell。
$_SESSION超级全局变量包含与所有会话变量有关的信息。
$langlang=”abc”;
$$langlang=”&langlang”;
其作用是把&langlang赋值给名为abc的变量。
因此,下面两行代码将得到相同的结果:
echo $langlang $abc;
echo $langlang ${$langlang};
两个结果都是输出字符串abc &langlang。
boolean define(string name,mixed value[,bool case_insensitive]) 参数name常量名的返回值是字符串类型,常量值或者表达式value的返回值是混合类型(常量只能够包含标量数据,也就是boolean,integer,float和string),case_insensitive这个可选参数值如果为TRUE,那么后面对此常量的引用将不区分大小写。
define(“PI”, 3.141592);
下面的代码使用了这个常量:
printf(“The value of pi is %f”,PI); 这里的%f表示浮点数。
$pi2=2*PI;
printf(“Pi doubled equals %f”,$pi2);
此代码生成如下结果:
The value of pi is 3.141592.
Pi doubled equals 6.283184.
常量是全局的,可以在脚本的任何位置引用。(你在任何位置都可以召唤我这个常量朋友。)
表达式是一个短语,它表示程序中的某个特定动作。所有表达式至少由一个操作数和一个或多个操作符组成。
$a=5; //将整型值5赋值给变量$a
$a=”5” //将字符串5赋值给变量$a
$sum=50+$some_int; //将50和$some_int的和赋值给$som
$wine=”langlang”; //将“langlang”赋值给变量$wine
$inventory++; //将变量$inventory自增1
操作数是表达式的输入。
$a++;// $a就是操作数。
$sum=$val1+$val2;//$sum,$val1和$val2都是操作数。
操作符优先级是操作符的一个特性。
$total_cost=$cost+$cost*0.06;这里先计算$cost*0.06,再加上$cost.
可以等价地写为:
$total_cost=$cost+($cost*0.06);
$value=3*4*5*7*2;
这个例子与下例相同:
$value=((((3*4)*5)*7)*2);
乘法(*)操作符的结合性是从左至右的。
$c=5;
print $value=$a=$b=$c;
上面的示例与下例相同:
$c=5;
$value=($a=($b=$c));
计算这个表达式时,变量$value,$a,$b,$c都将包含值5,因为赋值操作符(=)的结合性是从右至左的。
算数操作符中的$a%$b就是$a除以$b的余数。
$a=”abc”.”def”; $a通过拼接赋值为”abcdef”。
$a.=”ghijkl”; $a等于它的当前值与”ghijkl”的拼接结果。
//$a包含字符串值“Spaghetti &Meatballs”;
$a=”Spaghetti” . ”&Meatballs”;
$a.=”are delicious.”;
//这个时候的变量a通过拼接赋值操作符.=的拼接之后,值变为”Spaghtti &Meatballs
are delicious.”(什么时候都可以使用拼接操作符,拼接可以创造出很多不一样,有个性的东西。)
自增(++)和自减操作符(--)可以将当前变量的值增1或者减1。(你可以减去我一个朋友,你也可以帮助我增加一个朋友哦。因为,我看似朋友很少,但其实,还可以。)
$inv=15; //将整型值15赋值给$inv
$oldInv=$inv--; //先将$oldInv中的值赋值给$inv,然后将$inv自减。
$origInv=++$inv; //先将$inv自增,然后将$inv中的新值赋值给$origInv.
将操作数放在操作符前面称为前自增和前自减运算。而放在后面称为后自增和后自减运算。(自增和自减操作符使用的顺序对变量的值有重大影响。操作符放的顺序不同,就像排在队伍的不同位置是一样的道理,对于数值的改变有重大影响。)
逻辑操作符常用于控制结构中,如if条件和while及for循环。
$a&&$b 与 如果$a,$b都为true,则输出true
$a AND $b 与 如果$a,$b都为true,则输出true
$a || $b 或 如果$a或$b为true,则输出true
$a OR $b 或 如果$a或$b为true,则输出true
!$a 非 如果$a不为true,则输出true
NOT $a 非 如果$a不为true,则输出true
$a XOR $b 异或 如果只有$a或$b为true,则输出true
file_exist(“filename.txt”) OR echo “File does not exist!”;
会有两种输出:
通过file_exist函数判断文件filename.txt是否存在。
如果判断出文件不存在,则输出句子”File does not exist!”;
相等操作符,用来比较两个值。测试其相等性。
$a==$b 是否相等 如果$a和$b相等,则输出true
$a != $b 是否不相等 如果$a和$b不相等,则输出true
$a ===$b 是否相同(恒等符号,判断变量内容和类型是否相等。) 如果$a和$b相等,并且类型也相同,则输出true
比较操作符与逻辑操作符相似,通过比较两个或多个变量值的结果,提供了一种控制程序流程的方法。
$a<$b 小于 如果$a小于$b,则输出true
$a>$b 大于 如果$a大于$b,则输出true
$a<=$b 小于或等于 如果$a小于或等于$b,则输出true
$a>=$b 大于或等于 如果$a大于或等于$b,则输出true
($a==12)?5:-1 三元运算 如果$a等于12,返回值为5,否则返回值为-1
当前,比较操作符只能够用来比较数值。(通过以上的这些操作符,再结合之前的代码和教程,其实就已经能够写出还算是可以的小程序了。PHP好像看似很难,但,其实PHP跟写作好像有着非常大的关联或者是联系,如果感兴趣的话,一直坚持下去,也一直跟我共同学习下去吧。)
$a & $b 与 $a和$b包含的每一位相与
$a | $b 或 $a和$b包含的每一位相或
$a ^$b 异或 $a或$b包含的每一位相异或
~$b 非 $a中的每一位取反
$a<<$b 左移 $a将接收到$b左移两位的值
$a>>$b 右移 $a将接收到$b右移两位的值
用双引号括起的字符串在PHP脚本中最为常见,因为它们提供了最大的灵活性,其原因是变量和转义序列都会得到相应的解析。(你用双引号强调了我,我就成为了你最为亲睐的字符串挚友。)
<?php
$sport=”boxing”; 变量$sport定义为boxing字符串。
echo “Jason’s favorite sport is $sport.”; 然后通过echo语句输出这一段话。变量$sport中的内容也在获得了之后输出。
?>
这个例子会返回:
Jason’s favorite sport is boxing.
<?php
$output=”This is one line.\n And this is another line.”;变量$output中的字符串内容会输出,换行符\n都会解析为换行符号。
echo output;
?>
它将在浏览器源代码中返回如下内容:
This is one line.
And this is another line.
PHP中可识别的转义序列
\n 换行符
\r 回车
\t 水平制表符
\\ 反斜杠
\$ 美元符
\” 双引号
\[0-7][1,3] 八进制记法
\x[0-9A-Fa-f][1,2] 十六进制记法
用单引号的时候,字符串就按照声明的形式原样解释。这表示,解析字符串时,变量和转义序列都不会进行解析。(你用单引号来定义我这个朋友的时候,我就变成了一个非常直接的朋友,不需要拐弯抹角。)
例如
print ‘This string will $print exactly as it \’s \n declared.’;
这会生成
This string will $print exactly as it’s \n declared.(你会很惊喜地发现print语句中单引号中的内容除了\’转义为了’,其他都没有进行解析,而是原样显示。)
print ‘This is another string.\\’;
这会生成:
This is another string.\ print语句中的\\被解析成了\
<?php
$website=”http://www.romatermini.it”;
echo <<<EXCERPT
Langlang is a very good and old boy.
EXCERPT;
?>
这个语句中,开始和结束标识符必须相同。这个例子中的开始和结束标识符为EXCERPT。
当然你也可以用LANGLANG作为你喜欢的开始和结束操作符也可以。当然,限制也是有的,该标识符必须完全由字母数字字符和下划线组成,而且不能以数字或者下划线开头。就比如1ABC和_ABC不能够作为开始和结束标识符。
开始标识符前面必须有三个左尖括号:<<<
结束标识符必须在一行开始处,而且前面不能有空格或任何其他多余的字符。
If条件是所有主流编程语言中最常见的结构。(if如果你想改变我,那请通过if语句来改变我身边最熟悉也最陌生的你自己。)
if(expression){
statement
}
<?php
$secretNumber=453; 定义变量$secretNumber为整型453;
If($_POST[‘guess’])==$secretNumber){ 通过$_POST中传过来的guess判断是否与$secretNumber相等
echo “
Congratulations!
”; 然后通过echo语句打印输出Congratulations!}
?>
条件体只包含一条语句时,如果你很懒,可以不使用大括号。
<?php
$secretNumber=453;
If($_POST[‘guest’]==$secretNumber) echo”
Congratulations!
”; 这里就直接使用echo语句了,echo之前也就没有使用大括号,在同一行写入代码了。是可以的。?>
<?php
$secretNumber=453;
If($_POST[‘guess’]==$secretNumber){
echo “
Congratulations!!
”;} else{
echo “
Sorry!
”; if以上判断中的语句如果为假,则执行else语句后面的echo打印。if你不认同我,else我或许也不会认同你。其实if跟else是相互衔接的,互有关联的。
}
?>
<?php
$secretNumber=453;
$_POST[‘guess’]=442;
if($_POST[‘guess’]==$secretNumber){
echo ‘
Congratulations!
”;}elseif(abs($_POST[‘guest’])-$secretNumber)<10){ abs函数返回一个数的绝对值。判断$_POST[‘guest’]减去变量$secretNumber的数值的绝对值是否小于10。如果小于10,则执行echo语句,否则执行随后的else语句。
echo “
You’re getting close!
”;}else{
echo “
Sorry!
”;
}
?>
<?php
switch($category){
case “news”: case”news”就是switch语句中的一条分支。
echo “
What’s happening around the world
”;break;
case “weather”: case”weather”也是switch语句中的一条分支。如果switch中的变量$category的内容为weather的时候,就执行case”weather”中的语句。
echo “
Your weekly forecast
”;break;
case “sports”:
echo “
Latest sports highlights
”;break;
default:如果switch中的$category跟case中的内容都不一样的时候,则执行default中的语句。
echo “
Welcome to my Website
”;}
?>
注意,以上每个case块的末尾处的break语句就意味着这个case块已经执行结束了。
while(expression){
statements
}
<?php
$count=1;
while($count<5){ 判断当$count的数值等于5时,while循环的判断就结束了。
printf(“%d square=%d <br/>”,$count,pow($count,2)); pow($count,2)是求$count的平方。
$count++;
}
?>
<?php
$linecount=1; 定义变量$linecount为1
$fh=fopen(“sports.txt”,”r”); 以只读方式打开sports.txt
while(!feof($fh) &&$linecount<=5){ 通过while判断$fh还没有到达文件末尾feof或者变量$linecount小于等于5
$line=fgets($fh,4096); fgets()函数会在到达指定长度,这里为4096-1字节,碰到换行符,
读到文件末尾(eof)时,停止并返回一个新行,这里是最后赋值给$line。
echo $line.”<br/>”;
$linecount++;
}
?>
do...while循环条件是while的一种变体,它在代码块的结束处验证循环条件,而不是在开始处。其语法为:
do{
statements
}while(expression);
do...while语句中的代码块总是至少会执行一次。(你在你的人生中总是必然会经历一次以上的背叛。如果你愿意经历do,你也愿意承担之后的while风险的话。)
<?php
$count=11;
do{
printf(“%d squared=%d <br/>”, $count, pow($count,2));
}while($count<10);
?>
输出为11 squared=121
for语句提供了比while更复杂的循环机制。其语法为:
for(expression1;expression2;expression3){
statements
}
//例子1
for($kilometers=1;$kilometers<=5;$kilometers++){ for循环里设定变量$kilometers为1,变量$kilometers设定的时候小于等于5,变量$kilometers后自增
printf(“%d kilometers=%f miles <br/>”,$kilometers,$kilometers*0.62140);
将$kilometers乘以0.62140并通过printf函数打印出来
}
//例子2
$kilometers=1;
for($kilometers=1; $kilometers++){
if($kilometers>5) break; 判断如果变量$kilometers大于5,break语句随即退出循环。
printf(“%d kilometers=%f miles <br/>”,$kilometers,$kilometers*0.62140);
}
//例子3
$kilometers=1;
for(;;){ 这里for(;;)跟while(true)的意思是一样的。如果为真则执行之后的代码段。
if($kilometers>5) break;
printf(“%d kilometers=%f miles <br/>”, $kilometers,$kilometers*0.62140);
$kilometers++;
}
foreach循环结构语法最擅长循环处理数组,从数组中提取每个”键/值”对,直到获得所有项,或满足某些内部条件为止。
foreach(array_expr as $value){ 从数组中获取每个值,每次迭代都将指针后移一位,这样就能够更加接近数组的末尾,这里也就是数组array_expr的末尾。
statement
}
<?php
$links=array(“www.apress.com”,www.php.net”,”www.apache.org”); 定义了一个存放三个网站url地址的$links数组。
echo “Online Resources:<br/>”;
foreach($links as $link){ 通过foreach函数获得每个网站url地址。
echo “<a href=\”http://$link\”>$link</a><br/>”;
}
?>
第二种形式适合处理包含键和值的数组。语法如下:
foreach(array_expr as $key=>$value){
statement
}
$links=array(“The Apache Web Server”=>”www.apache.org”,
“Apress”=>”www.apress.com”,
“The PHP Scripting Language”=>”www.php.net”);
数组$links里存储了相应的key和value值。
echo “Online Resource:<br/>”;
foreach($links as $title=>$link){ 通过foreach语句取出数组$links中的相应的键/值对。
echo “<a href=\”http://$link\”>$title</a><br/>”;
}
<?php
$primes=array(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47);声明一个都是素数的数组。
for($count=1;$count++;$count<1000){ 通过for循环从第1次到第999次执行999次
$randomNumber=rand(1,50); rand函数是返回随机整数,rand(1,50)是在1到50之内生成随机整数。
if(in_array($randomNumber,$primes)){ 通过in_array函数判断如果$randomNumber在$primes数组内
break; 语句强制结束
}else{
printf(“Non-prime number found: %d <br/>”,$randomNumber); 通过printf函数打印$randomNumber中生成的随机整数。
}
}
?>
下面是上例的输出:
Non-prime number found:48
Non-prime number found:42
Prime number found:17
通过添加goto语句,你可以直接跳到一个循环或条件构造之外的某个特定位置。(你想在你任何一个方面尝试改变的时候,可以通过goto语句来实现你所认为的蜕变,到你最想达到的位置。)
<?php
for($count=0;$count<10;$count++) 循环从0到9执行了10次
{
$randomNumber=rand(1,50);
if($randomNumber<10)
goto less; //通过goto语句跳转到后面的less分支语句。
else
echo “Number greater than 10:$randomNumber<br/>”;
}
less:
echo “Number less than 10:$randomNumber<br/>”; 这里就是之前的goto语句跳转到的less程序段,实现了打印输出的功能。
?>
这会生成以下结果:
Number greater than 10:22
Number greater than 10:21
Number greater than 10:35
Number less than 10:8
continue语句使当前循环迭代执行结束,并从下一次循环迭代开始执行。(如果你想继续友情,继续坚持PHP开发的话,那请使用continue语句来继续你对于现实的热情。)
<?php
$usernames=array(“grace”,”doris”,gary”,”nate”,”missing”,”tom”); 声明一个$usernames数组,里面有6个元素。
for($x=0;$x<count($usernames);$x++){ 定义一个for循环,通过count函数计算$usernames数组中的元素数量,并作为接下去循环的次数。
if($usernames[$x]==”missing”) continue; 如果$usernames数组中发现missing的时候,使用continue重新开始重复执行。
printf(“Staff member:%s <br/>”,$usernames[$x]); 最后用printf函数输出$usernames数组。
}
?>
结果输出如下:
Staff member:grace
Staff member:doris
Staff member:gary
Staff member:nate
Staff member:tom
include()语句将在其被调用的位置处判断并包含一个文件。
include(/path/to/filename)
与print和echo一样,使用include()时可以忽略括号。
<?php
include “/usr/local/lib/php/wjgilmore/init.inc.php”; 包含一个外部的php文件。
?>
if(expression){
include(‘filename’); 通过if和else语句来调用相应的include文件。
else{
include(‘another_filename’);
}
?>
当然include()语句也可以包含合法的URL地址。
include “http://www.langlang.com/index.html?background=blue”;
include_once()函数的作用跟include()相同,不过它会首先验证是否已经包含了该文件。它其实只会包含文件一次。(我只想通过include_once()包容你一次,你能够接受么?)
include_once(filename)
require(filename)
require()出错时,脚本将停止执行,而在使用include()的情况下,脚本将继续执行。同时也无论require的位置如何,指定文件都将包含到出现require()的脚本中。无论如何require()都必须要包含到指定的文件。
require_once(filename)
require_once()函数确保文件只包含一次,在遇到require_once()后,后面再试图包含相同的文件时都将被忽略。
<?php
$value=pow(5,3) //返回5的3次方,125。
echo $value;
?>
如果只是希望输出函数的结果,可以不把这个值赋给变量,而是直接输出(我其实挺喜欢直来直去的人,因为,这样的人,通常都比较真诚。这种方式在直接输出里也是这样来理解的。)
<?php
echo pow(5,3);
?>
echo “Five raised to the third power equals”.pow(5,3).”.”; 通过.操作符将pow(5,3)拼接起来。
当前也可以使用printf(),更有说服力:
printf(“Five raised to the third power equals %d.”,power(5,3)); 这里的%d是带符号十进制数。后面的power(5,3)就是显示在%d这个位置的。
以上两种情况都将返回以下结果:
Five raised to the third power equals 125.
当然,最开始的时候就可以使用预定义模板来定义一个函数,如下:
function functionName(parameters) 定义了一个自定义函数,函数名叫做functionName,parameters就是传入的参数。
{
function-body 函数体
}
考虑下面的函数generate_footer(),它将输出一个页脚:
function generateFooter()
{
echo “Copyright 2007 W.Jason Gilmore”;
}
之前定义了之后,就可以像下面这样调用这个函数(函数一旦定义好了,就能够在任何位置通过声明这个函数的名字来进行调用。定义好了曹操,然后写曹操的时候曹操就自动来了。都是一样的道理。)
<?php
generateFooter();
?>
function calcSalesTax($price,$tax) 这个函数接受两个参数,名为$price和$tax。它们将在计算中使用。
{
$total=$price+($price*$tax);
echo “Total cost:$total”;
}
以上的这个calcSalesTax函数,可以有如下的调用:
calcSalesTax(15.00,0.0);
当然,也可以这样
<?php
$pricetag=15.00;
$salestax=0.075;
calcSalesTax($pricetag,$salestax); 以这种方式传递参数时,称为按值传递。
?>
在有些情况下,可能希望在函数内对参数的修改在函数范围外也能反映,按引用传递参数就可以满足这种需要。按引用传递参数(也称传引用)要在参数前加上&符号。
<?php
$cost=20.99;
$tax=0.0575;
function calculateCost(&$cost,$tax) 传入的参数&$cost是对变量$cost的引用。
$cost=$cost+($cost*$tax); 修改变量$cost中的值
$tax+=4; 变量$tax增加4
}
calculateCost($cost,$tax);
printf(“Tax is %01.2f%% <br/>”,$tax*100); %01.2f%%,01中的0是填空字元,如果位置空着,就用0来填满,1规定小数点前面的数字占位要有1位以上,.2f代表小数点后有两位,%%就代表百分号%。这句printf最后打印输出的就是Tax is 5.75%
printf(“Cost is: $%01.2f”,$cost); 这句话最后打印输出的事Cost is $22.20 在这个函数中,$tax因为是按值传递,所以数值依然相同,而$cost因为是按引用传递,所以数值已经改变。
?>
function calcSalesTax($price,$tax=0.0675) 这里变量$tax就指定为了一个默认的参数值
{ $total=$price+($price*$tax);
echo “Total cost:$total”;
}
仍可以为$tax传递其他的税率,通过调用calcSalesTax()函数才会使用默认值0.0675:
$price=15.47;
calcSalesTax($price);
可以指定某个参数为可选参数,当然,这些参数要放在参数列表的末尾,而且要指定其默认值为空。(默认的朋友其实一直都在你面前,关键是看你怎么看待这个对于你而言一片空白的朋友。我其实是无所谓的。)
function calcSalesTax($price,$tax=””) 这里变量$tax就被指定为一个可选的参数,而且默认值等于””,也就是空白。
{
$total=$price+($price*$tax);
echo “Total cost:$total”;
}
以上这个函数,如果没有销售税,可以如下调用calcSalesTax()函数,而不指定第二个参数:
calcSalesTax(42.00);
这个调用会返回如下结果:
Total cost:$42.00
如果指定了多个可选参数,可以选择性地传递某些参数。(多个可选的朋友,看似好像有点没有多大重要性,但是,关键看你怎么去看待它们。它们其实一直静悄悄地守候在你的身边凝视着你。)
function calculate($price,$price2=””,$price3=””) 这里变量$price2和$price3就指定为了多个可选参数了。
{
echo $price+$price2+$price3;
}
调用calculate()函数时,可以只传递$price和$price3,如下:
calculate(10,””,3); 变量$price3本来在参数列表里为空,这里被传入参数,赋值为3。
它返回如下值:
13
return()语句可以向函数调用者返回任意确定的值。
function calcSalesTax($price,$tax=0.0675)
{
$total=$price+($price*$tax);
return $total; 这里不输出变量$total而是选择通过return语句返回变量$total
}
还有一种方式,可以直接返回计算结果,而不要赋给变量$total,如下:
function calcSalesTax($price,$tax=0.0675)
{
return $price+($price*$tax); 这里就直接通过return语句返回这几个变量的计算结果。
}
下面是调用这个函数的例子:
<?php
$price=6.99;
$total=calcSalesTax($price); 这里calcSalesTax函数就传入一个变量$price参数,$tax有默认值,然后通过return返回了计算结果之后,最后赋值给变量$total。(走遍千山万水,最后发现自己最中意的某个朋友其实只是通过自己的努力一直在经营着,在传递着而已。)
?>
利用list()构造可以很方便地从数组中获取值。如下:
$colors=array(“red”,”blue”,”green”);
list($red,$blue,$green)=$colors; 通过list()构造获取$colors数组中的相应值,并赋值给$red,$blue,$green。
?>
<?php
function retrieveUserProfile()
{
$user[]=”Jason”;
$user[]=”[email protected]”;
$user[]=”English”;
return $user;
}
list($name,$email,$language)=retrieveUserProfile(); 通过list构造获取函数retrieveUserProfile中的数组$user的相应的三个值,并赋值给$name,$email,$language。
echo “Name:$name,email:$email,language:$language”; 然后在这里打印输出
?>
执行此脚本将返回:
Name:Jason,email:[email protected],language:English
function amortizationTable($pNum,$periodicPayment,$balance,$monthlyInterest)
$pNum标识为还款编号,$periodicPayment表示每月总的还款额,$balance表示剩余贷款额,
$monthlyInterest指定了每月的利率。
{
$paymentInterest=round($balance*$monthlyInterest,2); 通过round函数对每月贷款利息保留两位小数进行获得。并赋值给每月贷款利息$paymentInterest
$paymentPrincipal=round($periodicPayment-$paymentInterest,2); 通过每月总的还款额$periodicPayment减去每月贷款利息$paymentInterest,用round函数保留两位小数,并赋值给每月还款本金$paymentPrincipal。
$newBalance=round($balance-$paymentPrincipal,2); 通过剩余贷款额$balance减去每月还款本金$paymentPrincipal,用round函数保留两位之后赋值给新的剩余贷款额$newBalance。
if($newBalance<$paymentPrincipal){
如果新的剩余贷款额$newBalance小于每月还款本金$paymentPrincipal,新的剩余贷款额设定为0,避免它为负数。
$newBalance=0;
}
printf(“<tr><td>%d</td>”,$pNum); 以带符号十进制数%d的格式打印还款编号$pNum。
printf(“<td>$%s</td>”,number_format($newBalance,2)); 以字符串格式%s显示变量$%s.
printf(“<td>$%s</td>”,number_format($periodicPayment,2)); 通过格式化数字函数number_format将得到的新的剩余贷款额$newBalance和每月总的还款额$periodicPayment进行数字的格式化。并打印出来。
printf(“<td>$%s</td>”,numberformat($paymentPrincipal,2));
printf(“<td>$%s</td></tr>”,numberformat($paymentInterest,2));
如果新的剩余贷款额$newBalance还没有为0,递归调用amorizationTable函数
if($newBalance>0){
$pNum++;
amortizationTable($pNum,$periodicPayment,$newBalance,$monthlyInterest);
}else{
return 0;
}
}
使用递归的还贷进度计算器
<?php
设定贷款余额
$balance=10000.00;
设定贷款利率
$interestRate=0.0575;
设定每个月的利率
$monthlyInterest=$interestRate/12;
设定贷款年限,这里设定为5年
$termLength=5;
每年支付还贷的次数
$paymentsPerYear=12;
设定支付编号,次序
$paymentNumber=1;
决定并设定好总的支付还贷次数
$totalPayments=$termLength*$paymentsPerYear;
决定定期付款的利息部分
$intCalc=1+$interestRate/$paymentsPerYear;
决定定期付款,用到了pow()函数用来求x的y次方的值。
$periodicPayment=$balance*pow($intCalc,$totalPayments)*($intCalc-1)/(pow($intCalc,$totalPayments)-1);
将定期付款保留到小数点后的两位,用到了round()函数进行四舍五入运算。
$periodicPayment=round($periodicPayment,2);
创建一个表格
echo “<table width=’50%’ align=’center’ border=’1’>”;
指定表格宽度设定为50%,排列方式为居中,边框的厚度设定为1像素
echo “<tr>
<th>Payment Number</th><th>Balance</th> th标签定义了HTML表格中的表头单元格
<th>Payment</th><th>Interest</th><th>Principal</th>
</tr>”;
调用递归函数,传入四个参数,支付编号,定义付款,贷款余额,每月的利率
amortizationTable($paymentNumber,$periodicPayment,$balance,$monthlyInterest);
关闭表格
echo “</table>”;
?>
为了程序代码的重用性(方便以后的重复使用代码,对于懒惰的程序员而言,这未尝不是一件福音,大家说是吧。),开始产生了函数库。
<?php
function localTax($grossIncome,$taxRate){ 定义了一个地方税localTax函数,传入了两个参数,总收入$grossincome,税率$taxRate
//函数体
}
function stateTax($grossIncome,$taxRate,$age){ 定义了一个州税stateTax函数,传入了三个参数,总收入$grossIncome,税率$taxRate,年龄$age
//函数体
}
function medicare($grossIncome,$medicareRate){ 定义了一个医疗保险费medicare函数,传入了两个参数,$grossIncome总收入,$medicareRate医疗保险费率
//函数体
}
传统上把数组定义为一组有某种共同特性的元素。当然,数组中的元素甚至可以不属于同一种类型。数组结构中的实体包含两个项:键(key)和值(value)。可以通过查询键来获取其相应的值。这些键可以是数值键或关联键。数值键的例子:
$states=array(0=>”Alabama”,”1”=>”Alaska”...”49”=>”Wyoming”); 其实这个例子中的数值键与值没有真正的联系,它们只是值在数组中的位置。很多看似很明显的东西,通过这个例子好像看不出什么,但,或许,挺明显的。它只是为了更好地显示这个数组中的数据。
使用数值索引,可以如下引用第1个州(Alabama):
$states[0]
PHP中的数值索引数组以位置0开始,而不是1。
当然,关联键与值有一定关系。下面这个例子:
$states=array(“OH”=>”Ohio”,”PA”=>”Pennsylvania”,”NY”=>”New York”)
如果要引用Ohio这个值,可以通过如下调用
$states[“OH”]
还可以创建包含数组的数组,这称为多维数组。(在数据集中还有数据集,就像我中有了你之后,我跟你之间的友情,就蜕变成为了一种非常奇怪的存在。但,这种存在是有意义的。然后就被定义为了是多维数组的一种转化。)
例如,可以使用一个多维数组存储美国各州的信息。
$states=array(
“Ohio”=>array(“population”=>”11,353,140”,”capital”=>”Columbus”),
“Nebraska”=>array(“population”=>”1,711,263”,”capital”=>”Omaha”)
);
然后可以如下引用Ohio的入口:
$states[“Ohio”][“population”]
数组里面其实有数组指针这个概念,数组指针就如同书签,告诉你正在检查的数组位置。(就像你开车通过GPS导航来定位路是一样的道理。有了数组指针的指引,就知道自己到底到了数组的什么位置。)
当然了,PHP不需要在创建数组时指定其大小。
因为数组没有大小限制,所以只需建立引用就可以创建数组。
$state[0]=”Delaware”;
然后可以打印输出数组$states的第一个元素:
echo $state[0];
接下来,可以为数组索引映射新值,从而添加其他的值:
$state[1]=”Pennsylvania”;
$state[2]=”New Jersey”;
...
$state[49]=”Hawaii”;
当然,其实也可以在创建时省略索引值:(该忽略的时候,你就发现你可以忽略很多看似不存在但却是固定的编程烦恼。)
$state[]=”Pennsylvania”;
$state[]=”New Jersey”;
...
$state[]=”Hawaii”;
下面的示例创建了一个数组:它将美国州名映射到其加入联邦的日期:
$state[“Delaware”]=”December 7,1787”;
$state[“Pennsylvania”]=”December 12,1787”;
$state[“New Jersey”]=”December 18,1787”;
...
$state[“Hawaii”]=”August 21,1959”;
当然,用array()创建数组比起以上的这种方式,更加显得正式。英文名称很多时候确实很直接,但却也非常值得这样来使用。
array()的数组形式:
array array([item1[,item2...[,itemN]]])
下面举一个使用array()创建数组索引的例子:
$languages=array(“English”,”Gaelic”,”Spanish”);
这里$languages[0]=”English”,$languages[1]=”Gaelic”,$languages[2]=”Spanish”
还可以用array()创建一个关联数组:
$languages=array(“Spain”=>”Spanish”,
“Ireland”=>”Gaelic”,
“United States”=>”English”);
这样一来$languages[“Spain”]=”Spanish”
$languages[“Ireland”]=”Gaelic”
$languages[“United States”]=”English”
通过相应的索引确实能够访问到相应的键值。(人生中索引,或许真的能够指引你今后人生路上的方向。而不单单只是一种指引。)
void list(mixed...)
下面显示了如何使用list()同时为多个变量赋值:
打开users.txt文件
$users=fopen(“users.txt”,”r”); 以只读模式通过fopen函数打开users.txt文本
当没有到达文件末尾的时候,跳到下一行
while($line=fgets($users,4096)){
从$users指向的users.txt文件中读取一行并返回长度最多为4095字节的字符串。
//使用explode()去分隔每个数据片,并赋值给$name,occupation,$color。
list($name,$occupation,$color)=explode(“|”,$line);
格式化并输出数据
prinf(“Name:%s<br/>”,$name); 以%s字符串的格式打印Name
printf(“Occupation:%s<br/>”,$occupation);
printf(“Favorite color:%s<br/>”,$color);
}
fclose($users);
然后会读取users.txt文件的每一行,并如下格式化:
Name:Nino Sanzi
Occupation:professional golfer
Favorite Color:green
list()依靠函数explode()将一行分解为三个元素,这里explode()使用竖线作为元素分隔符,然后,这些元素分别赋给了$name,$occupation,$color。
range()函数是一个快速填充数组的简单方法,并会使用low到high范围的整数值填充数组。
array range(int low,int high,[,int step])
假设需要一个数组,其中包含骰子中所有可能出现的值:
$die=range(0,6); 等同于列举出一个数组$die=array(0,1,2,3,4,5,6)
如果希望有一个包含0到20之间所有偶数的数组,就可以使用步长值为2:
$even=range(0,20,2);
这里$even=array(0,2,4,6,8,10,12,14,16,18,20);
range()函数还可以用于字符序列。假设希望创建一个包含字母A到F的数组:
$letters=range(“A”,”F”);
//$letters=array(“A”,”B”,”C”,”D”,”E”,”F”);
数组的输出通常使用print_r()函数完成,其原型如下:
boolean print_r(mixed variable[,boolean return])
print_r()函数接受一个变量,并将其内容发送给标准输出,成功时返回TRUE,否则返回FALSE。
判断是否为数组的内置函数is_array()其形式为:
boolean is_array(mixed variable)
$states=array(“Florida”);
$state=”Ohio”;
printf(“\$states is an array:%s<br/>”,(is_array($states)?”TRUE”:”FALSE”)); 以%s字符串的格式输出数组$states
printf(“\$states is an array:%s<br/>”,(is_array($state)?”TRUE”:”FALSE”));
下面是执行该例子的结果:
$states is an array:TRUE
$state is an array:FALSE
其实对于数组而言,真正关键的是数组中的内容,到底是否应该定义一个自己内心深处真正应该关心的朋友的数组群,在孤单无依的时候有时候可以认真地回想起他们,毕竟,他们才是我们内心深处真正所渴望的那种存在。是对于我,对于你的依靠。编程的孤独,或许,就能够被彻底冲刷了吧。
array_unshift()函数在数组头添加元素,所有已有的数值键都会相应地修改,以反映其在数组中的新位置,但是关联键不受影响。
int array_unshift(array array,mixed variable [,mixed variable...])
下面这个例子在$states数组前端添加了两个州:
$states=array(“Ohio”,”New York”);
array_unshift($states,”California”,”Texax”);
这其实就相当于后来处理好之后的$states=array(“California”,”Texax”,”Ohio”,”New York”);
在数组尾添加元素
array_push()函数将variable添加到target_array()的末尾,成功时返回TRUE,否则返回FALSE。
可以为此函数传递多个变量作为输入参数,同时向数组压入多个变量(元素)。
int array_push(array array,mixed variable [,mixed variable...])
下面这个例子在$states数组的末尾又添加了两个州:
$states=array(“Ohio”,”New York”);
array_push($states,”California”,”Texax”);
这里$states=array(“Ohio”,”New York”,”California”,”Texas”);
array_shift()函数删除并返回数组中找到的元素。其结果是,如果使用的是数值键,则所有相应的值都会下移,而使用关联键的数组不受影响。其形式为:
mixed array_shift(array array)
下面的例子删除了$states数组中的第一个州:
$states=array(“Ohio”,”New York”,”Caifornia”,”Texas”);
$states=array_shift($states);
删除了元素之后的$states为array(“New York”,”California”,”Texas”)
获得了第一个元素之后的$states为”Ohio”
array_pop()函数删除并返回数组的最后一个元素。其形式为:
mixed array_pop(array target_array)
$states=array(“Ohio”,”New York”,”California”,”Texas”);
$state=array_pop($states);
这里删除了最后一个元素之后的$states为array(“Ohio”,”New York”,”California”)
得到了元素之后的$states为”Texas”
其实,不管是从数组头删除添加元素,还是数组尾删除添加元素,其实只是为了更好地理解数组的相应结构,改变并不可怕,最关键是如果尝试学习并适应这种改变。数组中相应的键和值其实都因为各自的关联而能够在删除和添加的时候产生作用,而使用关联键,或许是因为关联键自身的特殊性,所以,才能够不受影响。有些朋友对于你而言是很容易动摇的,就像数值键一样,而有些固定不变的朋友,不管你情况如何他们都不会改变,就像关联键一样。很多东西,看多了,适应了之后,就会发现,原来,我还是我,我的那些朋友们,或许有的已经改变,而有的,不用改变同时也无须改变。
boolean in_array(mixed needle,array haystack [,boolean strict]) 第三个参数strict可选,它强制in_array()在搜索时考虑类型。
$state=”Ohio”;
$states=array(“Califonia”,”Hawaii”,”Ohio”,”New York”);定义了一个存放了四个州的数组
if(in_array($state,$states)) echo “Not to worrry,$state is smoke-free!”;
判断$state中的内容是否在数组$states内,判断成功之后实现打印的功能。
如果在一个数组中找到一个指定的键,函数array_key_exists()返回TRUE,否则返回FALSE。其形式如下:(其实对于数组而言,键也好,值也好,都是一种指引,一种指示,一种显示数组结构的尝试的方法。交朋友这种东西,有时候确实是近朱者赤近墨者黑,键相当于这个人的名声,而值相当于这个人的相关信息。要想获取一个你想结识的好友的信息,其实并不难。)
boolean array_key_exists(mixed key,array array)
下面的例子将在数组键中搜素Ohio,如果找到,将输出这个州加入美国联邦政府的有关信息:
$state[“Delaware”]=”December 7,1787”;
$state[“Pennsylvania”]=”December 12,1787”;
$state[“Ohio”]=”March 1,1803”;
if(array_key_exists(“Ohio”,$state)) 通过判断Ohio这个key是否在$state数组中出现过,判断成功打印一段英文,并以%s字符串的格式显示。
printf(“Ohio joined the Union on %s”,$state[“Ohio”]);
结果如下:
Ohio joined the Union on March 1,1803
array_search()函数在一个数组中搜索一个指定的值,如果找到则返回相应的键,否则返回FALSE。其形式如下:
mixed array_search(mixed needle,array haystack[,boolean strict])
下面的例子在$state中搜索一个特定的日期(December 7),如果找到,则返回相应州的有关信息:
$state[“Ohio”]=”March 1”;
$state[“Delaware”]=”December 7”;
$state[“Pennsylvania”]=”December 12”;
$founded=array_search(“December 7”,$state); 从$state数组中的值内查找是否有December 7如果有,返回相应的键。然后再以%s的格式显示并打印输出。
if($founded) printf(“%s was founded on $s.”,$founded,$state[$founded]);
输出如下:
Delaware was founded on December 7.
array_keys()函数返回一个数组,其中包含所搜索数组中找到的所有键,(我其实可以一下子搜索好几个微信好友并返回,其实都是通过他们的微信昵称来定位他们的。他们,应该也会非常欣喜吧。这里就要用到array_keys()函数。)其形式如下:
array array_keys(array array[,mixed search_value])
如果包含可选参数search_value,则只会返回与该值匹配的键。下面的例子将输出$state数组中找到的所有的键值:
$state[“Delaware”]=”December 7,1787”;
$state[“Pennsylvania”]=”December 12,1787”;
$state[“New Jersey”]=”December 18,1787”;
$keys=array_keys($state); 从$state数组中搜索所有键。
print_r($keys);
输出如下:
Array([0]=>Delaware [1]=>Pennsylvania[2]=>New Jersey)
这里将三个键都打印了出来,前面还加上了数值索引。
array_values()函数返回一个数组中的所有值,并自动为返回的数组提供数值索引,其形式如下:
array array_values(array array)
下面的例子将获取$population中找到的各州人口数:
$population=array(“Ohio”=>”11,421,267”,”Lowa”=>”2,936,760”);
print_r(array_values($population));
这个例子的输出如下:
Array([0]=>11,421,267[1]=>2,936,760)
其实,当你觉得你适合交朋友的时候,你可以用你所认为的认真,你所认为的PHP中的部分语法来定义出他们的数组集,同时还能够通过你自己的逻辑思维和判断来做一点看上去非常有趣的事。
key()函数返回input_array中当前指针所在位置的键。其形式如下:
mixed key(array array)
下面的例子通过迭代处理数组并移动指针来输出$capitals数组的键:
$capitals=array(“Ohio”=>”Columbus”,”Iowa”=>”Des Moines”);
echo “
Can you name the capitals of these states?
”;while($key=key($capitals)){ 通过key()函数获得$capitals中的键并赋值给$key
printf(“%s <br/>”,$key); 然后以%s字符串的形式打印出来
next($capital); 通过next()函数移动$capitals数组中的指针,移动到下一个数据,也就是从Ohio移动到lowa,其实调用key()函数时不会移动指针的。
}
将返回以下结果:
Can you name the capitals of these states?
Ohio
Iowa
current()函数返回数组中当前指针所在位置的数组值,其形式如下:
mixed current(array array)
以下的这个例子是获取数组值的:
$capitals=array(“Ohio”=>”Columbus”,”Iowa”=>”Des Moines”);
echo“
Can you name the states belonging to these capitals?
”;while($capital=current($capitals)){ 通过current()函数获取数组$capitals中的当前数组值。并赋值给$capital
printf(“%s <br/>”,$capital);
next($capitals); 通过next()函数移动$capitals数组中的指针。
}
输出如下:
Can you name the states belonging to these capitals?
Columbus
Des Moines
each()函数返回input_array的当前键值对,并将指针推进一个位置。其形式如下:
array each(array array)