phpBasic
来源:互联网 发布:开源人工智能语音系统 编辑:程序博客网 时间:2024/06/01 10:21
一、 Introduction
PHP:Hypertext Prepocessor,超文本预处理器,是一种通用开源脚本语言。语法吸收了c语言、java和perl的特点,易学,主要适用于web开发领域。Php将程序嵌入html文档中,执行效率高。Php支持很多数据库和操作系统,可以用c、c++进行程序的扩展。
Windows系统下,Php可以直接在命令行运行,不需要配置环境变量。从官网下载php的软件包,解压到d盘下。打开命令行,准备一个php的hello.php文件,内容如:
<?php
Echo “hello world”
?>
在命令行输入:d:\php\php.exe “d:\hello.php”。可以看到输出hello world。
也可以在命令行,编写和运行php代码运行,比如:d:\php\php.exe -r “echo ‘hello world’;$i=1;echo $i;”。
二、 搭建php运行的环境
由于php主要用于web开发,所以需要搭建php做web开发的环境。做web开发都需要依赖web服务器,php可以使用apache服务器。Web服务的过程大致是客户端发起请求到服务端,也就是这个apache服务器,然后服务器响应客户端。没有服务器,就没有web服务的持续进行。Web服务的过程实际上也是数据的交互,所以需要在服务端有数据库存放用于交互的数据。Php主要是做的服务器端与数据库的交互,也就是web的后端,相对于浏览器端客户端的展示页面。
1. 安装win平台下的apache服务器
从官网下载win平台下的apache服务器软件,解压后,将Apache24(或者22等其他版本)文件夹复制到一个目录下。为了关于管理一般为apache\mysql\php建立一个专门的安装目录。然后根据解压文件里面的readme_first.html指导安装开启apache服务。一般步骤是:
打开命令行,进入复制的apache文件的bin目录下,执行httpd -k start就可以开启apache服务,执行后到浏览器输入localhost,查看是否启动成功。
一般apache是以后台服务形式的,所以,要安装到后台服务,执行,httpd -k install。安装成功后在计算机》管理》服务和应用程序》服务里面会有apache的服务项,可以设置开机是否启动等。
然后执行httpd -k start,可以启动apache。
关闭apache,httpd -k stop。重启apache,httpd -k restart。卸载apache,httpd -k uninstall。
2. 配置php模块处理
将php语言包复制到这apache同目录下。在apache配置php模块。
在apache的conf目录下的httpd.conf文件中,配置如下:
#配置php模块
LoadModule php7_module "D:\php\amp\php\php7apache2_4.dll"
#设置.php后缀与php模块的映射
<FilesMatch "\.php$">
setHandlerapplication/x-httpd-php
</FilesMatch>
然后重启apache,修改生效。
上述配置文件还可以等同于
#配置php模块
LoadModule php7_module "D:\php\amp\php\php7apache2_4.dll"
#设置.php等后缀与php模块的映射
AddType application/x-httpd-php .php .pap .ppp .phaha
这种配置方式更简单灵活。
3. Php的配置
Php文件的编码,注意保存时或者编辑时改为utf-8。不然用浏览器打开有乱码。因为浏览器一般只认utf-8。
1) 时区配置
在php语言包的php.ini中配置。Php.ini包括两个文件一个是php.ini-development,是用于开发场景的php.ini。一个是php.ini-production,是用于生产场景的php.ini。
在开发过程中,可以配置php.ini-development。将php.ini-development复制一份,修改为php.ini。然后配置比如:
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
;date.timezone =
date:timezone=PRC
修改时区为prc。
在apache的配置文件httpd.conf中,设置php.ini的路径:
#配置php.ini的路径,不需要写php.ini的文件名
PHPIniDir “D:\php\amp\php”
重启apache。
2) mysql模块配置
在php.ini中,设置模块所在的路径(关键字是extension_dir),修改为php语言包中的ext目录的完整物理路径,比如:
extension_dir="D:/php/amp/php/ext"
然后在php.ini中,打开mysql模块,比如(一般是注释的,放出来就可以):
extension=php_mysql.dll
extension=php_mysqli.dll
;高版本php中使用下面的mysql
extension=php_mysqli.dll
extension=php_pdo_mysql.dll
注意,php5.X之后,废弃php_mysql.dll了。
配置好后,重启服务器。
Php5.X连接服务器的代码为:$link = mysql_connect(“localhost”,”root”,”root”);
Php5.X之后连接服务器的代码为:$mysqli = newmysqli("localhost","root","1234");
4. mysql的安装与配置
从oracle的官网下载windows平台的mysql,安装。
安装好后,在php连接代码下,var_dump($mysqli)或者var_dump($link),重新浏览php文件,可以看到连接成功了。
5. 主机(站点)配置
1) 单站点配置
Apache安装成功后,就默认配置了一个“站点”,该站点的实际位置在:apache安装包的/htdocs/下。
如果配置了其他的站点访问的实际位置,需要设置新的访问位置的权限,比如php7中的配置:”f:/xxx/xxx”:
DocumentRoot "D:/php/test"
<Directory "D:/php/test>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
DirectoryIndex hello.php
</Directory>
关于版本不同,配置不同,可以根据所在版本的例子配置相应的参数。
设置服务器名,ServerName localhost:80,可以任意配置的,比如配成ServerName www.haha.com:80。如果配置了其他域名,请在c盘下的hosts文件中做127.0.0.1(ip)和域名的映射。一个站点可以配置多个ip。
配置监听端口,在apache的主配置文件httpd.conf中,Listen 80。可以同时配置多个listen监听,如果只写端口,表示本机的多个ip都使用该端口。否则表示只“负责”(监听)该ip的该端口。
2) 访问目录权限配置
上述访问位置的配置就是访问目录权限配置的一种方式。这种成为集中式权限。还可以配置分布式权限,即针对某个网站的任何一个下级目录,都可以单独设置访问权限,且可以不重启apache生效。
修改AllowOverride all。比如:
DocumentRoot "D:/php/test/fenbu"
<Directory "D:/php/test/fenbu>
Options Indexes FollowSymLinks
AllowOverride all
Require all granted
DirectoryIndex hello.php
</Directory>
然后,在该目录下的任何子目录中,创建一个特殊的文件(.htaccess),在该文件中配置“权限内容”,比如:
Deny from all
Allow from 192.168.12.123
那么,哪个目录下有.htaccess,这个目录就具有了特殊的权限。而且不用重启apache,即生效。
3) 多站点配置
首先,在httdp.conf中,放开多站点虚拟主机配置文件项(关键词:vhosts),比如:
Includeconf/extra/httpd-vhosts.conf
然后在conf/extra/目录下的httdp-vhosts.conf文件中,设定提供多站点服务的ip地址和端口(关键字:NameVirtualHost),通常默认是:*:80,其中“*”代表所有ip,比如:
NameVirtualHost *:80
然后设置各个站点,比如:
<VirtualHost *:80>
ServerName www.php2.com
#设定站点别名,比如为了区别移动端和pc端的访问而使用别名
ServerAlias wap.php2.com
DocumentRoot "d:/php/test1 "
<Directory"D:/php/test1>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
#DirectoryIndex hello.php
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName www.php3.com
DocumentRoot "d:/php/test2 "
<Directory"D:/php/test2>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
#DirectoryIndex hello.php
</Directory>
</VirtualHost>
然后重启apache,访问分布的站点。
注意:配置了多站点,则在httdp.conf中配置的站点失效,而且多站点中默认站点为第一个站点。也就是说,如果访问的域名不在设置的站点中,但是这个域名映射的ip是apache设置的多站点中存在的,则apache会默认让这个域名访问这个ip对应的站点中的第一个。
4) 虚拟目录的设置
比如某个真是访问目录下有个目录叫做aaa,那么通过www.php2.com/aaa,访问这个目录,则成aaa为真实目录。
虚拟目录就是不存在的目录,但是可以通过这个目录访问指定的真实目录。比如,通过www.php2.com/xuni访问到aaa目录。
虚拟目录又叫目录别名。
首先,设置目录别名的名字和真实目录的映射,比如:
Alias /目录别名的名字 “真实目录的路径”
然后,设置该真实目录的访问权限(如果不设置就是禁止访问的):
<Directory “真实目录路径”>
....
</Directory>
比如php7下在httdp-vhosts.conf:
<IfModule dir_module>
Alias /xuni "D:/php/test1/d1"
<Directory"D:/php/test1/d1">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</IfModule>
三、 Php编程基础
(一)语法形式
1. Php的标识符
形式1
<?php
Context;
?>
形式2
<script language=”php”>
Context;
</script>
注意这种形式在php7已经失效。
形式3
<?
Context;
?>
形似3需要依赖于php.ini中的一个配置,即short_open_tag = On
注意:php的结束标识,比如?>,在php语句之后没有html代码结束符可以省略。如果省略了结束标记,就不可以省略;。
2. 大小写语法规范
变量区分大小写,常量默认不区分,但可以设定为不区分(不推荐),其他场合的关键字都不区分,比如函数名,系统关键字(for,if,return…)。
3. 分号结束
一条语句使用一个分号结束,在一个php语句标识中的最后一个分号可以省略,但是省略结束标识符则不可以省略最后一个分号。
4. Php的注释
单行注释,//,#。
多行注释,/*xxxxxx*/
快速注释反注释的技巧
//*(这个句首的/去掉就是注释,加上就是反注释)
Xxxx
Xxxx
//*/
或者(使用条件判断,1==0注释,1==1反注释)
If(1 == 0){
Echo “aaa”;
Echo “bbb”;
Echo “ccc”;
}
(二)变量
变量就是包含名称和值的标识符,名称和值的关系称为“引用”,使用变量名其实是使用该变量名的引用。变量必须以$开头,后面跟变量名,比如$bianliang = haha;直接给一个变量赋值,如果是第一次赋值就是定义了一个变量。
1. 变量的基本操作
赋值;取值;判断isset();判断一个变量是否有效,不存在或值为null的就是无效,比如$ s1 = 1;$ s2 = isset(s1);;删除unset();就是断开变量名与数据之间的“引用关系”,比如unset(s1);。
2. 变量命名规则
以字母或下划线开头,后跟任意数量的字母、数字或下划线。
3种常见的变量命名方法:驼峰命名法,比如$daXiGua;帕斯卡命名法,比如$DaXiGua;下划线间隔法,比如$da_xi_gua。
3. 变量的传值方式
赋值传值,又称值传递,比如$ s1 = $ s2。
引用传值,又称引用传递,比如$ s1 = &$ s2。&可以看作是地址符,这相当于s1和s2指向同一个地址,其中任何一个都可以修改这个地址的值,两个的值以最后修改者的为最终值。
4. 可变变量
如果一个变量的值是另一个变量,则称这个变量为可变变量,比如:$a = ‘b’;$b = 10;则echo $$a;结果是10,$$a是可变变量。注意不要使用引号引住可变变量,不然失效。也可以多个$,比如$$$$$a,多重的可变变量。
5. 预定义变量
预定义变量,就是php中,预先定义好的变量,可以直接用。主要有:$_GET,$_POST,$_REQUEST,$_SERVER,$GLOBALS。这些都是数组,是系统定义和维护的,具有超全局作用域,不同情形下可能有不同的值。
1) $_GET
用户以get方式提交时所提交的所有数据。数据是数组形式的。get提交方式有4种。
表单,<form method=”get”>
a链接,<a href=”aaa.php?a=5&b=6”>xxx</a>
页面跳转,Location.href=”aaa.php?a=5&b=6”;
页面跳转,Location.assign(“aaa.php?a=5&b=6”);
php的页面跳转,
<?php
Header(“location: aaa.php?data=1&data2=1”);
?>
在php页面获取get数据的方式可以post数据类似,比如:
$data1 = $_GET[“data1”];
$data2 = $_GET[“data2”];
Print_r($_GET);或者var_dump($_GET);
2) $_POST
用户以post方式提交<form method=”post”>时所提交的所有数据。数据是数组形式的。
比如有一个表单:
<form action=”post_data.php” method=”post”>
数据1:<input type=”text” name=”data1” /><br />
数据2:<input type=”text” name=”data2” /><br />
<input type=”submit” value=”提交” /><br/>
</form>
那么在post_data.php中,可以获得post提交的数据,比如:
<?php
$data1 = $_POST['data1'];
echo $data1;
$data2 = $_POST['data2'];
echo $data2;
print_r($_POST);
?>
注意使用empty(变量);判断变量的内容是否为空。
上述post_data.php可以增加健壮性判断,比如:
<?php
if(!empty($_POST)){
$data1 = $_POST['data1'];
echo $data1;
$data2 = $_POST['data2'];
echo $data2;
print_r($_POST);
}else{
echo "非法访问";
}
?>
比如使用php编写一个计算器:
<!DOCTYPE html>
<head>
<title>php计算器</title>
</head>
<body>
<?php
if(!empty($_POST)){
$data1 =$_POST['data1'];
$data2 =$_POST['data2'];
$yunsuan =$_POST['yunsuan'];
if($yunsuan== "+"){
$result= $data1 + $data2;
}elseif($yunsuan == "-"){
$result= $data1 - $data2;
}elseif($yunsuan == "*"){
$result= $data1 * $data2;
}elseif($yunsuan == "/"){
$result= $data1 / $data2;
}
}else{
$yunsuan =null;
$result =null;
$data1 =null;
$data2 =null;
}
?>
<formaction="collector.php" method="post">
<inputtype="text" name="data1" value="<?php echo $data1?>" />
<selectname="yunsuan">
<optionvalue="+" <?php if($yunsuan=="+"){echo"selected";} ?> >+</option>
<optionvalue="-" <?php if($yunsuan=="-"){echo"selected";} ?> >-</option>
<optionvalue="*" <?php if($yunsuan=="*"){echo"selected";} ?> >*</option>
<optionvalue="/" <?php if($yunsuan=="/"){echo"selected";} ?> >/</option>
</select>
<inputtype="text" name="data2" value="<?php echo $data2 ?>" />
<inputtype="submit" value="=" />
<inputtype="text" value="<?php echo $result ?>" /><br/>
<inputtype="reset" value="重置" />
</form>
</doby>
</html>
3) $_REQUEST
是$_GET和$_POST的合集,同时存储了这两种数据。当不确定直到用户提交方式时,使用request可以避开使用post或者get而获得表单的数据。
比如:
<?php
if(!empty($_POST)){
$data1 = $_POST['data1'];
echo $data1;
$data2 = $_POST['data2'];
echo $data2;
print_r($_POST);
}
if(!empty($_GET)){
$data1 = $_GET['data1'];
echo $data1;
$data2 = $_GET['data2'];
echo $data2;
print_r($_GET);
}
if(!empty($_REQUEST)){
$data1 =$_REQUEST['data1'];
echo $data1;
$data2 =$_REQUEST['data2'];
echo $data2;
print_r($_REQUEST);
}
if(empty($_REQUEST)){
echo "非法访问";
}
?>
注意:当post数据和get数据项名相同时,默认是post数据覆盖了get数据。这个可以在php.ini中设置,request_order = "GP",后者post覆盖前者get,修改该为"PG",就是get覆盖post。
4) $_SERVER
表示在一次浏览网页的过程中的浏览器端的一些信息或服务器端的一些信息。这种信息,随着不同的页面,和不同的服务器,以及不同的时刻,都可能不同。
常用的参数有:
$_SERVER[‘REMOTE_ADDR’];
访问者的ip地址
$_SERVER[‘SERVER_ADDR’];
服务器所在的ip地址
$_SERVER[‘SERVER_NAME’];
服务器的名字
$_SERVER[‘DOCUMENT_ROOT’];
站点的真实物理地址,其实就是站点中设置的documentroot
$_SERVER[‘PHP_SELF’];
获取当前网页地址,不含域名部分
$_SERVER[‘QUERY_STRING’];
获取当前网页地址中的所有get数据,但是只是一个整体的字符串
比如:
echo "<table border='1' >";
foreach($_SERVER as $key => $value){
echo"<tr>";
echo"<td>";
echo$key;
echo"</td>";
echo"<td>";
echo$value;
echo"</td>";
echo"</tr>";
}
echo "</table>";
5) $GLOBALS
是一个重复性变量,里面存储了php程序员自己定义的所有全局变量。比如,定义了一个全局变量,$quanju = 1;那么$GLOBALS['quanju’],就是调用这个变量。这个变量主要用于在局部分为内不可以使用全局变量时,但是又需要使用全局变量时,使用$GLOBALS就可以取得全局变量。
比如:
$v1 = 1;
echo "<pre>";
print_r($GLOBALS);
echo "</pre>";
(三)常量
常量是相对于变量的,存储的数据是不会也不应该改变的“标识符”。常量的使用主要是定义和取值。
1. 常量的定义和使用
定义常量方式1:使用define(),比如define(“PI”, 3.14);
<?php
define("PI",3.14);
define("LOCAL","haha");
echo "<br />pi的值是:" . PI;
?>
定义常量方式2:使用const,比如const AA = 123;
常量的使用有2种形式,1种,直接使用其名字,比如:$s1 = PI*3;
2种,使用函数constant(),比如:constant(“常量名”);//常量名是一个字符串。
<?php
define("PI",3.14);
define("LOCAL","haha");
echo "<br />pi的值是:" . PI;
const AA = 1234;
echo "<br/>" . AA;
$s1 = PI * 3;
$s2 =constant("AA") * 2;
echo "<br/>" . $s1 . "<br />" . $s2;
?>
使用defined();可以判断常量是否存在,比如:defined(“PI”);返回0\1。
使用未定义的常量,php会假定这个常量名就是这个常量的值。
2. 预定义常量
系统中预先定义的一些常量,约几百个,一般会用到的只有几个。比如:
M_PI,就是圆周率的常量值;
PHP_OS,php运行所在的操作系统;
PHP_VERSION,php的版本号;
PHP_INT_MAX,php中的最大的值;
其他常量可以参考php手册。
3. 魔术常量
只是常量的形式,但是没有常量的恒常的含义,它的值会变化的,只有几个。比如:
__FILE__,代表当前网页文件;
__DIR__,代表当前网页文件所在的目录;
__LINE__,代表当前这个常量名所在的行号。
注意是两个下划线相连的,是__不是_。
(四)数据类型
1. 数据类型表
基本类型(标量类型)
整数类型
int, integer
浮点数类型
float, double
字符串类型
string
布尔类型
bool, boolean
符合类型
数组
array
对象
object
特殊类型
空类型
null
资源类型
resource
2. 整数类型
$n1 = 123;//10进制数字写法
$n2 = 0123;//8进制数字写法
$n3 = 0x123;//16进制数字写法
$n4 = 0b1010;//2进制数字写法
进制转换使用的函数,十进制向其他进制转换,转二进制decbin();转8进制decoct();转16进制dechex();其他进制向十进制转换,二进制转十进制bindec();八进制转十进制octdec();十六进制转十进制hexdec();关于其他进制间的转换,可以以十进制为中介实现,比如8转2,首先8转10,octdec();,然后10转2,decbin();。
3. 浮点数类型
表示方法:1,$v1 = 123.343;2,$v2= 123.343E2;(表示123.343乘以10的2次方)。
浮点数使用时需要注意的问题:
1) 浮点数不应进行大小比较;
因为程序中所有数字,最终的表示形式,都是2进制,浮点数的2进制形式,不能完全表达准备。
2) 小数转二进制的做法,乘2并顺序取整数部分;
3) 当整数运算结果超出整数的范围后,会自动转换为浮点数。
4. 字符串类型
字符串的4种表示形式:
$s1 = “xxxxx”;双引号字符串中,可以识别的转义字符有\\ \” \n \r \t \$。比如:$s2 = “adbd\ccd\’sdf\$sdf”;
$s2 = ‘xxxxxx’;单引号字符串中,可以识别的转义字符只有\\和\’。比如:$s1 = ‘abc\\cd\’sdf’;
$s3 = <<<”标识符A”xxxx标识符A;双引号定界符字符串,比如:
<?php
$s1 = "sdf\$sdf<br/>";
echo $s1;
$s2 = <<<"AAA"
sldkjf,字符。
AAA;
echo $s2;
?>
注意:定界符结尾符一定要在所在行的开头,不要有空格或缩进。双引号定界符可以使用的转义字符\\ \n \r \t \$。双引号定界符的双引号可以省略。
Ss4 = <<<’标识符B’xxxx标识符B; 单引号定界符字符串,比如:
<?php
$s1 = "sdf\$sdf<br/>";
echo $s1;
$s2 = <<< ‘AAA’
sldkjf,字符。
AAA;
echo $s2;
?>
同样注意:定界符结尾符一定要在所在行的开头,不要有空格或缩进。
5. 布尔类型
布尔类型,bool或boolean。
值只有true和false或者0和1。比如:
$v1 = 12;
if($v1){
echo "<br />真";
}else{
echo "<br />假";
}
6. 类型转换
程序运行中,如果需要某种类型的数据,而给出的数据不是该类型,通常会发生自动转换,将给类型转换为目标需要的类型。比如:octdec($o);参数要求是字符串,如果不是,就会转换。比如:$s5 = 1 + "2";
7. 强制转换
强制类型转换使用语法:(目标类型)数据;比如:$s = (int)2.34;
还可以使用settype($变量名, “目标类型”);转换,比如:settype($s1, “int”);
8. 类型相关的系统函数
var_dump();用于输出变量的完整信息,只要用于调试代码。
getType();获取该变量的类型名字,返回的是一个表示该类型名字的字符串。
setType();变量类型强制转换。setType($s, “int”);
isset();判断变量是否有效。
empty();判断变量内容是否为空。
unset();删除变量。
is_xx类型();判断变量是否是某个类型。比如,is_int($s);
(五)运算符
1. 算术运算符
符号是:+ - * / %。是针对数字进行的运算,如果符号两边有不是数字的数据,会自动转换为数字,%只针对整数运算不是整数的只截取整数部分。
2. 自增自减运算符
符号是:++ --。
对于数字是自加1或自减1。对于字符串只能自增,且自增的是下一个字符,只针对字母或数字生效。对于布尔值无效。对于null自减无效,自增为1。
前自增和后自增的区别(自减类似):
前++,先完成变量的递增运算,再取得该变量的值参与别的运算。
后++,先将原来变量的值临时存储,在将变量值递增,最后将临时存储的值参与别的运算。
比如:
<?php
$s1 = 1;
$s2 = 1;
$s1 ++;
++ $s2;
echo $s1++ . ++$s2;
?>
3. 比较运算符
符号是:> < >= <= == != === !==
一般的比较是对数字进行的大小比较。
==和===,前者是模糊相等的比较。后者是精确相等的比较,只有数据的类型和数据的值/内容都相等,才是全等。
注意:不要对浮点数直接进行大小比较。
常见不同类型的比较,如果比较的数据中有布尔值,就转换为布尔值比较,布尔值只有一个规则,true>false。有数字的就转为数字比较。如果两边都是纯数字字符串,就转为数字比较。否则按字符串比较。字符串比较的规则是对两边的字符串,一个一个从前往后取出进行比较,谁先大,结果就是它大。
4. 逻辑运算符
逻辑运算符是针对布尔值进行运算,如果不是布尔值就转换为布尔值进行。运算规则,逻辑与&&,逻辑或||,逻辑非!。
注意:逻辑与和逻辑或的短路现象,即逻辑与中第一个为假逻辑与为假,不会去计算后面的内容,逻辑或中第一个为真逻辑或为真,不去计算后面的内容。适当利用逻辑运算的短路运算,可以提高效率。
5. 字符串运算符
符号:. 衍生出另一个:.=
含义:将两边的字符串连接起来。
如果两边都不是字符串,就会自动转换为字符串,然后连接起来。比如:”ba” . 3;就是”ba3”。
6. 赋值运算符
基本的符号是:=。比如:$s1 = 2;。
衍生的赋值运算符:
+=,比如:$s1 += 1;相当于,$s1 = $s1 + 1;
-=,比如:$s1 -= 1;相当于,$s1 = $s1 - 1;
*= /= %= .=类似。
7. 条件运算符
只有一个,数据值1?数据值2:数据值3;比如:$s1 > $s2 ? $s1 : $s2;
8. 位运算符
位就是2进制中每个数字就是一位。一个整数有32位。位运算符只针对整数进行运算。符号有:&按位与,|按位或,~按位非或按位取反,^按位异或,<<按位左移运算,>>按位右移运算。
9. 管理一组数据的开关状态
就是管理若干个只有2个状态的数据符号。管理数据状态的目标是使用一个变量可以表达若干个数据的当前状态。通过一个变量,可以获得任何一个数据的状态,可以将一个数据的状态关闭或开启。比如:
<?php
define("D1", 1);
define("D2", 2);
define("D3", 4);
define("D4", 8);
define("D5",16);
$state = 10;
if(($state & D1) > 0){
echo "<br />灯1亮";
}else{
echo "<br />灯1灭";
}
if(($state & D2) > 0){
echo "<br />灯2亮";
}else{
echo "<br />灯2灭";
}
//开启一个灯,用位或。
$state = $state | D3;
//关闭一个灯,用位与灯非
$state = $state & (~D2);
function stateAll(){
echo "<p>";
for($i = 1; $i <= 5;++$i){
$s = "D" .$i;
if(($GLOBALS['state']& constant($s)) > 0 ){
echo "灯{$i}亮";
}else{
echo "灯{$i}灭";
}
echo"</p>";
}
}
stateAll();
?>
10. 数组运算符
符号:+ == != === !==
+数组联合,将右边的数组项合并到左边数组的后面,如果有重复键,以左边的为准。
==如果两个数组具有相同的键名和键值,可以顺序不同或类型不同,则返回true。
===如果两个数组具有相同的键名和键值且顺序和类型都一样,则返回true。
11. 错误控制运算符
符号:@。通常只用在一个地方,即$link = @mysql_connect(“ip”, “user”, “password”);php7已经没有这个函数了。
作用是如果该连接数据的语句失败,则屏蔽该失败的错误提示。
12. 运算符的优先级
有括号,先括号。先乘除后加减。优先顺序是:单目运算符>算术运算符>比较运算符>逻辑运算符
(六)流程控制
主要包括条件控制和循环控制。
1. If分支结构
基本语法:
If(条件判断1){
分支1;
}else if(条件判断2){
分支2;
}…
Else{
分支…
}
2. Switch分支结构
switch(表达式){
case 值1:
分支1
break;//可以省略break;
case 值2:
分支2
break;//可以省略break;
……
default:
default分支;
}
比如:
<?php
$month = 4;
switch($month){
case 1:
echo"{$month}月有31天";
break;
case 2:
echo"{$month}月有29天";
break;
case 3:
echo "{$month}月有31天";
break;
case 4:
echo"{$month}月有30天";
break;
case 5:
echo"{$month}月有31天";
break;
default:
echo "哈哈";
}
?>
3. For循环结构
for(表示式1;判断表达式2;表达式3){
执行语句;
}
比如:
for($i = 1; $i<= 5; ++$i){
for($k = 1; $k <= $i; ++$k){
echo "*";
}
echo "<br />";
}
4. 循环的中断
中断循环的关键字:break,用于完全终止某个循环,让执行流程进入到循环语句后面的语句;
continue,用于停止当前正在进行的当此循环。
Php中可以指定中断的层数。比如:break 正整数n;和continue 正整数n;
循环的层指从当前中断语句算起,往代码的外部循环的个数,就是层数,比如:
for(…){
for(…){
for(…){
break 2;//表示中断第二个for。
}
}
}
5. do while循环
语法:
循环变量的初始化;
do{
执行语句;
循环变量的改变;
}while(循环变量的条件判断);
6. while循环
语法:
while(判断表达式){
执行语句;
循环变量的改变;
}
7. 流程控制的替代语法
if(…):
……
endif;
if(…):
…
else:
…
endif;
if(…):
…
elseif(…):
…
else:
…
endif;
switch(…):
case…
case…
endSwitch;
while(…):
…
endwhile;
for(…;…;…):
…
endfor;
比如:
$s2 = 4;
if($s2 > 0):
echo "haha";
else:
echo "hehe";
endif;
8. 控制脚本执行顺序
die(字符串)/exit(字符串),输出该字符串后,立即停止php的执行。也可以不加字符串,直接停止。
sleep($n),让程序停止运行指定的秒数,到时间后,继续。
比如:
echo "<br />" . Date("H:i:s");
sleep(5);
echo "<br />" . Date("H:i:s");
(七)文件加载
文件加载的关键字:include,require,include_once,require_once。
使用语法,比如:include “文件路径”;或者include(“文件路径”);
上述4个关键字只在加载失败时或是重复加载时,含义有所不同。可以载入php或html文件。
1. 文件加载的路径有3种表示方式:
1) 相对路径
是相对于当前网页文件所在的位置来定位某个被加载的文件位置,主要依赖以下2个特殊的路径符号,./表示当前位置,即当前网页文件所在的位置(目录);../表示上一级位置,即当前网页文件所在的位置的上一级位置。
比如:include “./page1.php”;include “../page2.php”;include “../ss/page3.html”;
2) 绝对路径
绝对路径有2种,本地绝对路径,比如:include “c:/dd/dd/hh.php”;
网络绝对路径,比如:include “http://www.aaa.com/ph.php”;
例子:
<?php
include"./zizeng.php";
include"D:/php/test1/tiaojian.php";
//一般不这样使用绝对路径而是以下方式
//方式1
include __DIR__ ."/tiaojian.php";
//方式2
$root =$_SERVER['DOCUMENT_ROOT'];
include $root ."/tiaojian.php";
?>
3) 无路径
就是没有给出路径信息,只给出文件名,不推荐。
比如:include “page1.php”;//php会在当前页面目录下找该文件。
2. 文件载入和执行过程详解
从include语句处退出php脚本模式(进入html代码模式),载入include语句所设定的文件中的代码,并执行之(如同在当前文件中一样),退出html模式重新进入php脚本模式,继续之后的代码。
3. 4个载入关键字的区别
Include和require的区别,include载入文件失败时,会报一个“提示错误”,然后继续执行后续代码;require载入文件失败时,报错并立即终止执行。通常,require用于在程序中,后续的代码依赖于载入的文件的时候。
Include_once和require_once的区别,同include和require的区别。
Include载入的文件不判断是否重复,只要有include语句,就会载入一次,即此时可能导致重复导入。Include_once载入的文件会有内部判断机制是否“前面代码”已经载入过,如果载入过,就不再载入。
Require和require_once的区别,同include和include_once的区别。
4. 被载入文件的返回值及return的作用
一个载入语句,如果载入成功,返回int(1),如果载入失败,返回false。比如:
<?php
include"./zifuchuan.php";
$s = include"./zifuchuan.php";
echo "<br/>";var_dump($s);
$s = include"./zifuchuan11.php";
echo "<br/>";var_dump($s);
?>
如果载入的文件中有return,那么有几种情况。
1) return语句的作用就是终止载入过程,该return语句的后续被载入文件的代码不再载入。
2) return语句也可以用于该被载入文件载入时返回一个数据,形式为:return $ss;
(八)错误处理
1. Php中错误的分类
语法错误,程序运行之前,都要先检查语法,如果有语法错误,就会立即报错,并且不会去执行程序。
运行时错误,是在程序语法检查通过后,开始运行程序并在此过程中遇到的错误。常见的有3个,提示性错误,警告性错误,致命错误。
逻辑错误,程序本身可以正常执行,没有报错,但计算结果却错了。
2. 错误的分级
Php中将各种错误进行了不同级别的分类归纳,并形成了大约10几个级别的错误。每一个级别的错误,都有代号,这个代号也是系统内部的常量。比如:
E_ERROR:致命错误
E_WRANING:警告性错误
E_NOTICE:提示性错误
用户自定义的错误:
E_USER_ERROR:自定义致命错误
E_USER_WARNING:自定义警告性错误
E_USER_NOTICE:自定义提示性错误
其他:
E_STRICT:严谨性语法检查错误。
E_ALL:其他错误。
3. 错误的触发
错误的触发,就是让错误发生。
有两种触发错误的方式:
1) 系统触发,程序运行到某行代码,确实出现了某种错误,此时系统 就会报错。系统触发的典型错误有3种:
E_ERROR:致命错误
比如调用了一个不存在的函数。
E_WRANING:警告性错误,会输出错误提示,并继续执行后续代码。
比如include载入一个不存在的文件。
E_NOTICE:提示性错误,会输出错误提示,并继续执行后续代码。
比如使用了不存在的变量或常量。
2) 自定义触发
当处理某些数据的时候,本来数据本身是没有错误的,但根据具体应用的需要,会要求数据满足某种条件,而该数据并不满足的时候,可以在程序中主动触发一个错误,以表明该数据的非法性。
比如:
<?php
$age = 999;
if($age > 120 || $age< 0){
trigger_error("年龄不符合要求", E_USER_ERROR);
}else{
echo"haha";
}
?>
4. 错误报告的显示
错误报告就是显示在网页上的错误提示内容。
1) 是否显示错误报告
方式1:
在php.ini中,设置display_erros的值,为on,显示,为off,不显示。
注意:前提条件是apache中已经装载了php.ini文件。如果没有装载,需要在apache的httpd.conf文件中加入如下一行:
PHPIniDir “php.ini文件的位置”
比如:
#配置php.ini的路径
PHPIniDir "D:\php\amp\php"
方式2:
在php的脚本文件中使用函数ini_set()来设置,比如:
ini_set("display_errors",0);
echo "<br/>aaa";
echo $v1;
include"./xx.php";
echo "<br/>sdd";
注意:在脚本中使用ini_set()的优先级高于php.ini中的设置。
2) 显示那些级别的错误
在开启显示错误的前提下,可以设置哪些级别的错误报告。有2种做法:
方式1,在php.ini文件中设置,error_reporting = E_ALL。修改这个语句的参数设置级别。
方式2,使用ini_set()函数,比如,ini_set(“error_reporting”, E_NOTICE);//表示显示这个级别的错误。
Ini_set(“error_reporting”, E_NOTICE | E_WARNING);
5. 错误日志的记录
错误日志就是错误报告,是将错误报告写入文件中,形成错误日志。
错误日志涉及到2个问题。
一个是是否记录日志。2种方式,一是php.ini中,log_errors = ON或者OFF。一是在脚本中,ini_set(“log_errors”, 1);参数可以为1\0\true\false。使用ini_get();可以获取某个设置项的值。
第二个问题是记录位置。2种方式,一是直接使用文件名,此时系统会自动在每个文件夹下都建立该文件名,并用其记录该文件夹下的所有网页文件发生的错误信息。第二种方式是,使用一个特殊的名字“syslog”,则此时所有错误信息都会记录到系统的日志文件中。
比如,ini_set(“error_log”, “my_error.txt”);
设置了ini_set(“error_log”, “syslog”);后,查看日志的位置,右键我的电脑》系统工具》事件查看器》window日志》应用程序。
6. 自定义错误处理器
发生错误后用来处理错误的机器,实际上是一个函数。
自定义错误是指,让系统不要去处理错误,而完全由开发者对错误进行处理,显示和记录。
步骤
第一步,设定用于处理错误的函数名,set_error_handler(“fe”);;
第二步,定义这个函数,比如:
function fe(){
//设置自定义错误的代码
echo “<h1>错误</h1>”;
}
带形参的自定义错误函数,比如:
function fe($errCode, $errMsg, $errFile, $errLine){
echo “<h1>错误</h1>”;
echo “<br />错误代号为:” . $errCode;
echo “<br />错误内容为:” . $errMsg;
echo “<br/>错误文件为:” . $errFile;
echo “<br/>错误行号为:” . $errLine;
}
(九)函数
1. 函数的定义和调用
函数就是一个处理数据的方法。比如,求和,求减,求平方,求面积,求是不是,求有没有,求行不行等等。形式如:
function 函数名($形参1,$形参2,$形参3,……){
处理数据的代码;
}
函数的调用就是给形参赋值后使用这个函数,可以作为变量的值,可以直接输出函数的返回值等等。
<?php
function f1($s1, $s2){
$s = $s1 * $s1 + $s2* $s2;
$result = sqrt($s);
return $result;
}
echo f1(12, 13);
?>
注意形参的引用的传值问题,比如:
function f2($s1, &$s2){
$s = $s1 * $s2;
return $s;
}
$s3 = 4;
//f2(1,4);是错误的调用函数的方式
echo "<br/>" . f2(4,$s3);
2. 函数参数的数量
通常函数调用时实参的数量应该和形参数量保持一致。如果函数定义时,形参有默认值,则对应的实参就可以进行一定程度的省略。注意,省略只能从右往左进行。
有一种定义和使用函数的特别形式,不定义形参,实参可以任意。系统函数中就有这样的函数,比如,var_dump($s1);var_dump($s1, $s2, $s3);这可以认为是可变参数。自定义的可变参数函数,比如:
function f3(){
$arr =func_get_args();
echo "<br/>" . func_get_arg(0);
echo "<br/>" . func_num_args();
}
f3(1, 3, 4);
f3("aa","ba");
3. 函数的返回值
函数的返回值不是固定的,根据需要,可以有返回值,也可以没有。返回值,通过return语句。比如:
function f4(){
return $s2;
}
return关键字会立即终止函数的执行,返回到调用函数的位置,继续执行后续语句。
4. 可变函数
可变变量,是一个变量的名字还是一个变量,比如:$s = “a”;$sa = 12;$$s就是一个可变变量。
可变函数,一个函数的名字还是一个变量。比如:
function f4(){
echo "<br/>函数";
}
$f5 = "f4";
$f5();//可变函数
echo $f5();
5. 匿名函数
匿名函数就是没有名字的函数。有2种形式。
形式1,将一个匿名函数赋值给一个变量,这个变量就代表该匿名函数了。
比如:
$f6 = function(){
echo "<br/>这是一个匿名函数";
};
$f6();//调用匿名函数
注意:匿名函数结尾的}后跟;结束。
$f7 = function($s1, $s2){
$re = $s1 + $s2;
return $re;
};
$s2 = $f7(1,2);
echo "<br/>" . $s2;
形式2:
直接将一个匿名函数当作实参来使用。也就是调用别的函数的时候,使用一个匿名函数当作实参。比如:
function f9($s1, $s2, $f8){
$s4 = $s1 + $s2;
$s5 = $s1 * $s2;
$f8($s4, $s5);
}
f9(1,2,
function($s1,$s2){
echo"<br />s1=$s1,s2=$s2";
}
);
6. 变量的作用域
变量的作用域,是一个变量在什么范围内可以使用。Php中,有3种可变作用域,局部作用域,就是一个函数的内部作用,这种变量称为局部变量。超全局作用于,就是指所有的代码范围,这种变量成为超全局变量,比如系统预定义的几个,$_GET,$_POST等。全局作用域,是不在函数内部的范围,函数外部作用的范围,这样的变量成为全局变量。
一般,全局范围不能访问局部变量,局部范围不能访问全局变量。比如:
$quanju = 1;
function f10(){
echo "<br/>内部访问外部:quanju=$quanju";
}
f10();
function f11(){
$neibu = 1;
}
echo "<br />外部访问内部:neibu=$neibu";
函数内部的变量,在函数调用结束后,就销毁了。但是一种局部变量在调用结束后不销毁,这就是静态变量。比如:
function f12(){
static $c = 0;
$c++;
$d = 0;
$d++;
echo "<br/>c=$c,d=$d,函数被调用次数为:$c";
}
f12();
f12();
f12();
在局部范围内访问全局变量的方式1是使用global关键字,global的作用是使外部变量和内部变量指向一个数据地址。比如:
$s5 = 5;
function f13(){
global $s5;
echo "<br/>局部访问全局s5=$s5";
$s5 = 15;
}
f13();
echo "<br />在全局再次访问s5=$s5";
在局部访问全局变量的方式2是使用$GLOBALS超全局变量,比如:
$s6 = 6;
function f14(){
echo "<br/>局部访问全局s6=" . $GLOBALS['s6'];
$GLOBALS['s6'] = 16;
}
f14();
echo "<br />在全局再次访问s6=$s6";
注意:如果对$GLOBALS变量的某个单元进行unset();,则就会完全对应销毁该变量。因为这不是引用关系。
7. 有关函数的系统函数
常见的有,
function_exists();判断一个函数是否被定义过,其中使用的参数为“函数名”。比如:
if(function_exists("f15")== false){
function f15(){
echo"<br />定义了一个函数";
}
}
f15();
func_get_arg();获取函数的参数。
func_get_args();获取所有参数。
func_num_args();获取参数的个数。
其他系统函数,比如,字符串函数,时间函数,数学函数。
8. 递归
递归是一种编程思想,递归就是程序自己调用自己,合理使用递归可以起到意想不到的效果。递归函数,是一个函数内部调用它自己的函数。比如,求数的阶乘的递归函数:
function jie($n){
if($n == 1){
return 1;
}else{
return $n * jie($n-1);
}
}
echo "<br />阶乘是" . jie(4);
9. 迭代
在编程中,指重复执行一组指令。一般使用循环迭代处理数据,以得到需要的结果。比如使用迭代求阶乘:
$start = 1;
for($i = 1;$i <= 5;++$i){
$res = $start * $i;
$start = $res;
}
echo "<br />跌代结果:" . $res;
比如使用迭代结算斐波那契数列:
$st1 = 1;
$st2 = 1;
$re1 = 0;
for($s1 = 1;$s1 <=4;++$s1){
$re1 = $st1 + $st2;
$st1 = $st2;
$st2 = $re1;
}
echo "<br />使用迭代算斐波那契数列:" . $re1;
(十)数组
数组就是一组数据的集合体,按照一定的顺序排列成一个链的结构。注意:php中的数组单元的顺序与下标无关。
1. Php中数组的定义和取值
$arr1 =array(3,4,5,6,7);//常见形式,下标为默认下标,从0开始
$arr2 = array(“a”=>3, “bd”=>4, “sdf”=>5, “sd”=>6);//下标为字符串
$arr4 =array(1=>3, 3=>4, 5=>2);//下标可以人为给定
$arr5 =array(1=>3, 3=>4, “sdf”=>5, “sd”=>6);//下标为字符串和数字的混合
$arr6 =array(1=>3, 3=>4, “sdf”=>5, 4, 6);//有指定下标,也有自动下标,此时下标为:1,3,sdf,4,5。自动下标为前面最大的下标加1.
$arr6 =array(1=>3, 3.6=>4, “sdf”=>5, 2);//此时下标为:1,3,sdf,4。指定的非整数下标会自动转换为整数,直接去掉小数位。
$arr6 =array(2=>3, true=>4, false=>5, 2);//下标为:2,1,0,3
$arr6 =array(1=>3, true=>4, false=>5, 2);//下标为:1,0,3。值为:4,5,2。如果下标重复,后面的会覆盖前面的。
$arr6 =array(1=>3, -1=>4, 3=>5, 2,);//下标为:1,-1,3,4。负数也可以为下标。
其他形式:
$arr2[]=3;
$arr2[]=4;
$arr2[]=5;//下标为:0,1,2。
$arr2[‘a’]=3;
$arr2[‘sdf’]=4;
$arr2[2]=5;//下标为:’a’,’sdf’,2。
其他情况同上。
注意:php中数组元素的顺序由放入数组的顺序决定,不是下标。
数组的取值:
$a = $arr[1];
$b = ‘ad’;
$c = $arr[$b];
2. 数组的分类
1) 按键值关系分
索引数组:通常,如果一个数组的下标是严格按照从0开始的连续的整数作为下标,则称其为索引数组。例如:$arr = array(1,3,4,5);。
关联数组:通常,如果一个数组的下标都是一个字符串并一定程度上标明了这个单元的含义,称为关联数组。例如:
$conf = array(
‘host’ => ‘192.168.0.1’,
‘port’ => ‘3306’,
‘username’ => ‘root’,
‘password’ => ‘12345’,
);
混合数组:既有数字下标,也有字符下标。比如:$arr6 = array(1=>3, 3=>4, “sdf”=>5, 4, 6);
2) 按数组的维数分
一维数组,比如:$arr6 = array(1=>3, 3=>4, “sdf”=>5, 4, 6);
二维数组,比如:
$aa = array(
array(1=>3, “sdf”=>5, 4, 6);
array(1=>3, 3=>4, 6);
array(1=>3, 6);
);
多维数组,就是在数组里面继续存放数组。
3. 数组的使用
常见问题
1) 求一个一维数组的平均值
$arr1 =array(2,34,34,5,6,756);
$l = count($arr1);
$sum = 0;
$count = 0;
for($i = 0;$i < $l;++$i){
$sum += $arr1[$i];
}
$count = $sum/$l;
echo "<br />{$l}数组的平均值为:" . $count;
2) 求一个二维数组的平均值
$arr2 = array(
array(2,345,6,756),
array(2,5,6,756),
array(2,34,34,5),
);
$l2 = count($arr2);
$sum2 = 0;
$count2 = 0;
$c = 0;
for($i = 0;$i < $l2;++$i){
$temp = $arr2[$i];
for($j = 0;$j <count($temp); ++$j){
$sum2 +=$temp[$j];
++$c;
}
}
$count2 = $sum2 / $c;
echo "<br />数组的平均值为:" . $count2;
3) 求一个一维数组的最大值
$arr3 = array(2,34,34,5,6,756);
$max = $arr3[0];
for($i = 0;$i <count($arr3); ++$i){
global $max;
if($arr3[$i]>$max){
$max =$arr3[$i];
}
}
echo "<br />最大值为:" . $max;
4) 交换一个一维数组的最大值和最小值的位置
$arr4 =array(2,34,34,5,6,756);
$max2 = $arr4[0];
$min2 = $arr4[0];
$minindex = 0;
$maxindex = 0;
for($i = 0;$i <count($arr4); ++$i){
if($arr4[$i] >$max2){
$max2 =$arr4[$i];
$maxindex=$i;
}
if($arr4[$i] <$min2){
$min2 =$arr4[$i];
$minindex =$i;
}
}
$arr4[$maxindex] = $min2;
$arr4[$minindex] = $max2;
echo "<br/>";var_dump($arr4);
4. 数组的遍历
1) foreach
形式:
foreach($arr1 as $key => $value){
//循环体,$key是下标项,$value是下标值
}
foreach可以使用break和continue。break退出遍历,continue退出此次单元的遍历。
2) 数组的指针
默认情况下,数组的指针指向数组的第一个单元。常用的数组的指针操作函数。
$s1 =current($arr1);//获得数组当前指针所在的单元的值。
$s2 =key($arr1);//获得数组当前指针所在单元的键。
$s3 =next($arr1);//将数组指针下移一个单元,获得该新单元的值。
$s4 = prev($arr1);//将数组指针上移一个单元,获得该新单元的值。
$s5 = end($arr1);//将数组指针直接移向最后一个单元,获得该新单元的值。
$s6 = reset($arr1);//将数组指针直接移向第一个单元,获得该新单元的值。
3) 使用for循环和next()遍历数组
for($i = 0; $i <count($arr4); ++$i){
$key = key($arr4);
$value =current($arr4);
echo "<br/>$key => $value";
$n = next($arr4);
var_dump($n);
}
4) each()和list()
each()的作用是先取一个数组的当前单元的下标和值并放入一个数组,然后将指针移到下一个单元。比如:
$arr5 = each($arr4);
$arr5 = each($arr4);
$arr5 = each($arr4);
print_r($arr5);
list()的作用是将数组的指定项赋值为变量。比如:
list($s1) = $arr4;
list($s2, $s3) = $arr4;//将下标为0和1的项赋值给变量。
list($s4, $s5, $s6) =$arr4;//将下标为0,1,2的项赋值给变量。
echo "<br/>$s1,$s2,$s3,$s4,$s5,$s6";
使用while(),echo(),list()遍历数组,比如:
while(list($key, $value) =each($arr4)){
echo "<br/>$key = $value";
}
5. 数组的排序
排序方法有很多种。比如冒泡、选择、快速、插入等。
1) 冒泡
简单说就是相邻比较,大者下降,全部降好为止。
for($i = 1; $i <count($arr4); ++$i){
for($j =0; $j <count($arr4) - $i; ++$j){
$tmp = 0;
if($arr4[$j]>$arr4[$j+1]){
$tmp =$arr4[$j];
$arr4[$j]= $arr4[$j+1];
$arr4[$j+1]= $tmp;
}
}
}
echo "<br/>";
print_r($arr4);
2) 选择
从0开始一个一个比,直到比完重新排好序为止。
for($i = 0; $i <count($arr4) - 1; ++$i){
for($j = $i + 1;$j< count($arr4); ++$j){
$tmp;
if($arr4[$i]> $arr4[$j]){
$tmp =$arr4[$i];
$arr4[$i]= $arr4[$j];
$arr4[$j]= $tmp;
}
}
}
echo "<br/>";
print_r($arr4);
6. 数组的查找
从数组中查找一个数据。一般有顺序查找和二分查找。顺序查找就是从头找到尾。二分查找就是在数组已经排好序后,一半一半的找。如果数据量很大,那么二分查找具有高效率的优点更明显。
采用递归函数实现二分查找:
$arrer =array(1,3,5,6,7,11,15,36,37,46,47,57,78,89,90,111,234);
$len = count($arrer);
$mid_index = 0;
function erfenzhao($arr,$search, $begin, $end){
$mid = floor(($begin+ $end)/2);
$mid_val =$arr[$mid];
if($mid_val ==$search){
return true;
$min_index =$mid;
}else if($mid_val> $search){
if($begin> $mid -1){
returnfalse;
}
$v =erfenzhao($arr, $search, $begin, $mid-1);
}else{
if($end <$mid +1){
returnfalse;
}
$v =erfenzhao($arr, $search, $mid+1, $end);
}
return $v;
}
$ss = 36;
$v1 = erfenzhao($arrer,$ss, 0, $len-1);
echo "<br/>";var_dump($v1);
采用简单循环实现二分查找
function erfenwhile($arr,$s){
$l = 0;
$h = count($arr)-1;
while($l <= $h){
$mid =floor(($l + $h)/2);
$mid_value =$arr[$mid];
if($mid_value== $s){
return1;
}elseif($mid_value > $s){
$h =$mid - 1;
}else{
$l =$mid + 1;
}
}
return -1;
}
$sw = erfenwhile($arrer,$ss);
echo "<br/>";var_dump($sw);
- phpBasic
- HTML JavaScript Vue 编辑器推荐
- Cassandra的安装与集群部署
- 【MyBatis】MybatisUtil工具类的作用(五)
- 《设计模式》学习笔记4——抽象工厂模式
- python基础-abstractmethod、__属性、property、setter、deleter、classmethod、staticmethod
- phpBasic
- 教程篇(5.4) NSE4 15. 高可用性 ❀ 飞塔 (Fortinet) 网络安全专家
- Retrofit的二次封装
- Linux下的tar压缩解压缩命令详解
- codeforce Vladik and Complicated Book
- html 布局
- 三级联动
- numpy.random.randn()与rand()的区别
- mongo::client::initialize() cause crash