1.Web 网站
1.静态网站访问原理
2.动态网站访问原理
2.Apache
1.软件的安装
-
获取 Apache 安装软件;
-
双击进行安装;
-
选择安装模式;
-
选择安装地址
- 自定义安装位置(尽量不要安装在 C 盘里面);
2.Httpd.exe 的详细应用
- 服务器进程:运行之后才可以工作;
-
用来查看 Apache 具有哪些功能以及配置文件是否出现错误;httpd 或者 httpd.exe 文件所在目录;
-
2.1 查看使用的模块
httpd -M
-
2.2 验证配置文件是否有效:
httpd -t
-
3.配置默认站点
-
让 Apache 确定服务器上访问的位置:网站文件夹所在位置;
Httpd-------> conf ---->DocumentRoot(文件的根目录)----------->DocumentRoot;
-
方便用户使用名字访问对应的网站:给文件夹对应的取一个别名;
Httpd-------> conf ---->DocumentRoot(文件的根目录)------>serverName;
2.1. 解开注释,痛死可以把端口给去掉,因为端口可以单独的设置;
conf文件里面有一个 listen 可以实现监听端口的变化
-
凡是涉及到 Apache 配置文件的修改,都需要重新启动 Apache 服务器才可以生效;
-
实现 DNS 域名解析:通常默认站点都是本地 DNS:hosts 文件;
C:\Windows\System32\drivers\etc\hosts
在文件里面添加代码127.0.0.1 localhost
2.安装与配置 PHP
1.安装 PHP 语言
-
获取 PHP 安装文件:建议去官网;
-
解压缩;
-
安装:放到自定义的文件夹下面
-
PHP 文件的目录结构;
-
PHP.exe 的应用
-
php.exe 就是可以解析 PHP 代码转变成 HTML 代码,从而实现浏览器的解析功能;
-
通过 CMD 命令进入到 PHP.exe 所在目录;
-
通过 PHP.exe 运行命令来制定要解析的 PHP 脚本就可以:
php.exe -f PHP文件所在目录
-
-
3.配置 Apache 加载 PHP 模块
-
Apache 加载 PHP 模块:在 Apache 的主配置文件中加载对应的 PHP 提供的模块
LoadModule php5_module
PHP 所提供的模块链接所在路径 -
Apache 分配工作给 PHP 模块:如果是 PHP 代码就交给 PHP 处理(以.php 结尾的文件就是 PHP 代码);
-
将 PHP 的配置文件加载到 Apache 的配置文件中:共同生效;
-
只需要在 Apache 中指定 PHP 的配置文件所在目录;
PHPIniDir 'php.ini文件所在目录'
-
php.ini 文件默认是不存在,是以 development 和 production 的形式存在的,需要格式化;
-
PHP 的配置文件已经添加到了 Apache 的配置文件目录中,需要重启 Apache 才能生效;
-
4.安装与配置 MySQL
1.安装 MySQL 软件;
-
获取 MySQL 安装软件;
-
双击进行安装;
-
选择 custom:自定义安装,选择安装路径;
- 软件安装目录:E:/server/mysql;
- 数据安装目录:E:/server/mysql/data;
-
选择详细配置;
-
选择开发环境(选择默认的);
-
选择功能(默认选中);
-
并发设置(建议手动设置);
-
配置访问环境;
-
字符集设定:系统字符集;
-
服务安装:将 MySQL 作为 windows 下的一个服务启动;
-
输入 Root 超级管理员的用户密码:一般我们使用 root;
-
等待配置即可实现安装;
2.MySQL 的目录结构说明;
-
bin 目录介绍;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X1YQ6dQB-1610525570940)(C:\Users\yarnnb\AppData\Roaming\Typora\typora-user-images\image-20201220161844215.png)]
-
软件设计结构;
- C/S:Client 客户端/Server 服务端,用户只需要安装客户端产品才能访问服务器,而且只能访问一种软件(当前自己);
- B/S:Browser 浏览器/Server 服务端,用户只需要安装浏览器,就可以访问所有的服务器(B/S 架构服务);
3.MySQL 的访问流程
MySQL 是一款 c/s 架构的软件,需要通过客户端来访问服务端(ps:MySQL 也提供了其他的访问方式:通过插件扩展的方式来充当客户端访问)
-
启用 MySQL 客户端
- mysqld.exe,该软件本身可以通过 CMD 命令运行;
- mysql.exe 通过 CMD 命令启动;
-
MySQL 客户端访问服务器端需要进行寻找匹配:连接认证
连接: IP 和端口确认,如果是本地都可以省略;
-
-h 主机地址 --> -hlocalhost(可以是 IP);
-
-p 端口 --> -p3306;
-
-u 用户名 —> -uroot ,不可以省略(匿名用户除外);
-
-p 密码 ----> -proot
mysql -hlocalhost -uroot -proot
mysql -uroot -p
-
-
退出命令
//1. \q //2.exit //3.ctrl+c
PS:通常连接认证的时候密码不建议明文,可以在输入-p 之后回车,系统会再次让输入密码,这个时候就是密文
5.PHP 连接 MySQL
PHP 本身不具备操作 MySQL 的能力,需要借助 PHP 操作 MySQL 的扩展进行实现
1.PHP 加载 MySQL 扩展
-
PHP 加载 MySQL 扩展:php.ini 文件中;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WMdLc1Vu-1610525570944)(C:\Users\yarnnb\AppData\Roaming\Typora\typora-user-images\image-20201220165716839.png)]
-
PHP 中所有的扩展都是在 ext 文件夹中,需要指定扩展所在路径:extension_dir
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WmYEzAND-1610525570952)(C:\Users\yarnnb\AppData\Roaming\Typora\typora-user-images\image-20201220171016493.png)]
-
加载之后需要重新启动 Apache 服务器
2.修改 PHP 默认时区
ps: 在 php.ini 文件中,查找 timezone 然后进行修改
6.配置虚拟主机
一台服务器很贵,如果只能部署一个服务器的话,则是非常的浪费,所以通过其他的渠道实现一台主机上面部署多个网站。
1.什么是虚拟主机
虚拟主机:virtual machine ,并不真实存在的主机,但是可以提供真实主机所实现的功能;通俗的讲,虚拟主机就是将计算机中不同的文件夹进行不同的命名,然后让服务器(Apache)根据用户的需求从不同的文件夹(网站)读取不同的内容。
2.虚拟主机的分类
在 Apache 中,可以将虚拟主机划分为两类;
-
基于 IP 的虚拟主机:一台电脑有多个 IP,每个 IP 对应一个网站;
原理:电脑默认只有一个 IP,因为电脑默认只配备一个网卡,但是有的电脑可以配备多个网卡,每个网卡可以绑定一个 IP 地址;
-
基于域名的虚拟主机:一台电脑只有一个 IP,但是 IP 下可以制作多个网站,但是需要给每个网站不同的名字(虚拟主机名);
7.PHP 基本语法
PHP 是一种可以运行在服务器端的脚本语言,可以嵌入到 HTML 中
1.PHP 标记
在 PHP 的发展历史中,可以使用多种标记来区分 PHP 脚本
-
ASP 标记 :<% php 代码 %>
-
短标记 : <? php代码 ?>
前面两种标记基本已经废弃,但是如果使用的话,还是可以使用的,需要在我们的 php 配置文件中进行配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3WwuPus1-1610525570955)(C:\Users\yarnnb\AppData\Roaming\Typora\typora-user-images\image-20201221221356118.png)]
-
脚本标记:
-
标准标记:<?php php代码 ?>
2.注释
//
:单行注释#
:单行注释- /**/ : 多行注释
3.语句分隔符
在 PHP 中语句的分隔符是英文下的分号
;
特殊说明:PHP 中标记结束符 ?> 有自带语句结束符的作用,最后一行 PHP 代码可以没有语句分隔符;
8.变量概念以及使用
1.变量
PHP是一种动态网站开发的脚本语言,动态语言特点就是交互性,会有数据的传递,而PHP作为“中间人”,需要进行数据的传递,PHP可以自己保存数据。
2.变量基本概念
变量来源于数学,是计算机语言中能存储计算结果或能表示抽象概念。变量可以通过变量名字来访问。在指令式语言中,变量通常是可变的的。
- 变量是用来存储数据的;
- 变量是有名字的;
- 变量是通过名字进行访问的;
- 变量是可以改变的;
3.变量的使用
PHP 的所有所有变量都是使用 “$” 进行定义;
-
定义:在系统中增加对应的变量名称(内存);
-
赋值:可以将数据赋值给变量名(可以在定义的同时完成);
-
可以通过变量名称访问存储的数据;
-
可以将变量从内存中删除;
//可以通过unset()函数对变量名称进行删除;
$time = time();
unset($time);
4.变量的命名规则
- 在 PHP 中变量名称必须使用 “ $ ”,进行开头;
- 名字由字母、数字和下划线 “_”,但是不能以数字开头;
- 在 PHP 中允许中文变量(不建议使用);
5.预定义变量
预定义变量:提前定义的变量、系统定义的变量,存储许多我们需要的数据(预定义变量都是数组)。
- $_GET 获取表单 以“get”方式提交的信息;
- $_POST 以‘post’方式提交的信息;
- $_REQUEST 发送的请求数据;
- $_GLOBALS PHP 中所有的全局变量;
- $_SERVER 服务器信息;
- $_SESSION session 会话数据;
- $_COOKIE cookie 会话数据;
- $_ENV 环境信息
- $_FILES 用户上传的文件信息
6.可变变量
可变变量:如果一个变量保存的值刚好是另外一个变量的名字,那么直接可以通过访问一个变量得到另外一个变量的值:在变量前面再多加一个 “$”号;
<?php
$a='b';
$b='cccc';
echo $$a;
?>
7.变量传值
将一个变量赋值给另一个变量:变变量传值;变量传值两种方式:值传递
,引用传递
;
值传递:将变量保存的值复制一份,然后将新的值给另外一个变量进行保存(两个变量之间没有关系);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-roYxmXlY-1610525570958)(C:\Users\yarnnb\AppData\Roaming\Typora\typora-user-images\image-20201222205026988.png)]
引用传递:将变量保存的值所在内存地址,传递给另一个变量:两个变量指向同一块内存空间(两个变量是同一个值);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6DiAKpDT-1610525570959)(C:\Users\yarnnb\AppData\Roaming\Typora\typora-user-images\image-20201222205757080.png)]
在内存中,通常存在一下几个分区:
栈区 :程序可以操作的内存部分,(不存数据,运行程序代码),少但是快;
代码段:存储程序的内存部分(不执行);
数据段:存储普通数据(全局区和静态区);
堆区 : 存储复杂数据,大但是效率低;
8.变量范围
-
局部变量
也被称之为内部变量。局部变量是在函数内部定义的,其作用域仅限于函数内部,离开函数后变量使用是错误的
-
全局变量
全局变量是用global定义的,从程序的开始可以一直存在程序的结尾,定义的常量就是全局的,不需要使用global关键字进行定义,可以在脚本的任何位置进行使用
-
静态变量
使用static关键字进行定义的变量
函数执行完成之后不会立即消失,当再次调用函数时,静态变量保存的值依然存在,并且仅在第一次执行函数的时候会初始化值
9.常量
常量和变量一样,都是用来保存数据的;
1.常量的基本概念
常量:const/constant,是一种在程序运行当中,不可改变的量(数据);常量一旦被定义,通常数据不会改变(用户级别);
2. 常量的定义形式
在PHP中存在两种定义的方式(5.3之后才有两种);
- 使用定义常量的函数:define(“常量名”,“常量值”);
- 5.3之后才有的:
const 常量名=常量值
常量的命名规则
- 常量不需要使用“$”进行命名,一旦使用系统就会认为是变量;
- 常量的名字组成由数字、字母、下划线组成,不能以数字开头;
- 常量的名称通常都是以大写字母为主,主要是为了和变量进行区分;
- 常量的命名规则比较松散,可以使用一些特殊字符,该方式只能使用define()函数进行定义;
define('-_-','smile');//正确的
const -_-='smile';//错误的
PS:注意细节
- define函数和const定义区别:在与访问权限区别;
- 定义常量通常不区分大小写,但是可以区分,可以参照define函数的第三个参数;
- 访问特殊字符的常量的时候,需要使用constant(“常量名称”)函数;
3.系统常量
系统常量:系统帮助用户定义的常量,用户可以直接使用;
常用的系统常量:
- PHP_VERSION:PHP版本号;
- PHP_INT_SIZE:整形大小;
- PHP_INT_MAX:整形可以表示的最大值(PHP中的整形是允许出现负数:带符号);
魔术常量:
在PHP中存在特殊的常量,以双下划线开头加常量名称,然后双下划线结尾,通常跟随系统改变,但是用户改变不了。
- __ DIR __:当前被执行文件的绝对路径;
- __ FILE __:当前被执行文件的绝对路径(带自己文件的名字);
- __ LINE __:当前执行代码的行数;
- __ NAMESPACE __:当前所属的命名空间;
- __ CLASS__:当前所属的类;
- __ METHOD __:当前所属的方法;
- __ FUNCTION __:获取当前函数的函数名称
10. PHP 的数据类型
数据类型:data type,在PHP中指的是存储数据本身的数据类型,而不是变量 的类型,PHP是一种弱类型的语言,变量本身没有数据类型。
1.PHP的八种数据类型
分为三大类八小类;
简单数据类型:4个小类
- 整形:int/integer ,系统分配4个字节存储,表示整数类型(有前提);
- 浮点型:float/double,系统分配8个字节存储,表示小数或者整形存不下的整数;
- 字符串型:string,系统根据实际长度分配,表示字符串(引号);
- 布尔类型:bool/boolean,表示布尔类型,只有true和false;
复合数据类型:2个小类
- 对象类型:object,存放对象(面向对象);
- 数组类型:array,可以一次性存储多个数据;
特殊数据类型:2个小类
- 资源类型:resource,存放资源数据,例如:PHP外部资源,如数据库、文件;
- 空类型:null,只有一个值,不能参与运算;
除了以上几种还有一种特别的数据:伪类型,主要有两种数据
mixed:混合的,可以是多种PHP中的数据类型
number:数值的可以是任意数值类型,整型或者浮点型
2.类型转换
<<<<<<< HEAD
3.类型判断
=======
在PHP中存在两种转换规则:
- 自动转换:根据系统的需求自己判定,自己转换,使用较多(但是效率比较低);
- 强制转换:人为根据需要进行目标类型数据转换;
在转换的过程中使用较多的转布尔类型(判断)和转数值类型(算术运算);
其他类型转布尔类型:true或者false,在PHP中很少的转换false;
强制转换规则:在变量之前增加一个括号(),然后在括号里面写上对应的数据类型:其中NULL类型需要用到unset()函数;
其他类型转数值的说明:
- 布尔值true为1,false为0;
- 字符串转数值有自己的规则;
- 以字母开头的字符串,永远为零;
- 以数字开头的字符串,取到碰到字符为止(不会同时包含两个小数点);
3.类型判断
通过一组函数进行数据类型的判断,最终返回这个变量所保存数据的数据类型,(相同结果为true,否则为false),是以is__开头的后面跟上数据类型的函数,例如:is_int(),判断数据是否为整形。
Bool类型的数据不能通过echo函数进行查看,需要通过var_dump()进行操作。
还有一种类型的函数可以输出数据类型对应的字符串;
- gettype(变量名):获取类型,得到改数据类型对应的字符串;
- settype(变量名,数据类型):设定数据类型,与强制转换不同;
- 强制转换是对数据值复制的内容进行处理(不会处理实际存储的内容);
- settype会直接改变数据本身;
4.数据类型列表
1.整数类型
保存整数数值(范围限制),4个字节存储数据,最大就是32位:42亿多,但是在PHP中默认是有符号类型,用来区分正负数,默认PHP输出的都是十进制。
在PHP中提供了四种定义整型的方式:
- 二进制定义:$a=10;
- 八进制定义:$a=0b110;
- 十进制定义:$a=120;
- 十六进制定义:$a=0x11010;
二进制:逢2进1,能够出现的数字是0-1;
八进制:逢8进1,能够出现的数字是0-7;
十进制:逢10进1,能够出现的数字是0-9;
16进制:逢16进1,能够出现的数字是0-9,以及a-f,其中a表示10,以此类推;
1.转换方法
十进制转二进制:除2倒取余法;
不管得到的结果如何,需要补足32位:前面补0,:00000000 00000000 00000000 00001010;
转换函数:
- decbin():十进制转二进制;
- decoct():十进制转八进制;
- dechex():十进制转十六进制;
- bindec():二进制转十进制;
2.浮点类型
浮点型:小数类型以及超过整形所能存储范围的整数(不包括精度),精度范围大概在15个有效数字左右;
浮点数的定义:
- $f=1.23;
- $f=1.23e10, ‘e’ 表示以10为底
尽量不要使用浮点数进行精确判断:浮点数保存的数据不够精确,而且在计算机中凡是小数基本上存的都不准确;
3.布尔类型
布尔类型:只有true和false,通常使用在判断中。
但是在进行某些判断的时候,要特别注意类型判断
- empty():判断数值是否为空,如果为空返true,否则false;
- isset():判断数据存储变量本身是否存在,存在即为true,否则为false;
4.字符串类型
定义语法:
-
单引号:
-
双引号:
引号方式适合定义比较短(不超过一行)或者没有语法结构要求的字符串,如果超过一行或者有语法结构可以使用下面的定义方式
-
nowdoc字符串:没有单引号的单引号字符串
-
heredoc字符串:没有双引号的双引号字符串
//打印会显示自定义的格式 $str1=<<<EOD hello world EOD; $str2=<<<'EOD' hello world EOD; var_dump($str1); echo '<br/>'; var_dump($str2);
1.字符串转义
含义:在计算机通用协议中,有一些特定的方式定义的字母,系统会进行特定处理,通常使用反斜杠+字母进行处理例如:\r\n
在PHP中识别转义符号也是同样的模式:反斜杠+字母
常用的转义符号:
\ ’ 在单引号字符串中显示单引号
\ " 在双引号字符串中显示双引号
\ r代表回车,理论上是回到当前行的首位置
\n 代表换行
\ t代表tab 类似换行,输出四个空格
\ $ 在PHP中使用 ¥符号作为变量符号,因此需要特定识别
单引号和双引号的区别
- 双引号中可以识别变量,单引号不可以,在双引号中要保证变量的独立性,可以使用{} 对变量进行对立性处理
结构化定义字符串的规则:
- 上边界符后面不可以跟任何的内容
- 下边界符必须顶格使用,而且只能跟分号,不能跟其他任何的内容
- 边界符之间所有的内容都是字符串本身
$str1="helloworld";
$str=<<<STR
<script>
alert('$str1');
</script>
STR;
echo $str;
2.字符串的长度问题
基本函数问题:strlen()获取到字符的长度,是以字节为单位的
$str="hello china";
$str_china='你好 中国';
echo strlen($str_china),"<br/>",strlen($str);//中文在utf-8字符集下面占用三个字节
使用mbstring模块进行字符串的扩展使用,需要在PHP配置文件(php.ini)中进行释放,strlen针对的是标准的ASCII码,而mbstring模块针对的是多种字符集的
3.字符串相关函数
-
转换函数:
implode:将数组用一定的规则连接成字符串
explode:将字符串按照一定的规则进行分割
str_split: 将一个字符串按照规定的长度进行切割成数组
-
截取函数:
trim: 去除字符串首尾处的空白字符(或者其他字符)
ltrim:去除左边的空格
rtrim:去除右边的空格
-
大小转换函数:
substr:从指定位置开始,截取指定长度的字符串
strstr:从指定位置开始截取到最后,可以用在取文件名字
-
替换函数:
strtolower:转换小写字母
strtoupper:转换大写字母
ucfirst:首字母大写
-
查找函数:
strpos: 查找字符串首次出现的位置
strrpos:计算指定字符串在目标字符串中最后一次出现的位置
-
替换函数:
str_replace:子字符串替换
-
格式化函数:格式化输出数据
printf:
sprintf:
$age = 25; $location = '河南省郑州市金水区'; $formatStr = 'TOM %d 岁 居住在 %s';//d 作为整形数字显示 s 作为字符串进行显示 echo sprintf($formatStr, $age, $location); // 需要过滤的字符串,过滤条件按照顺序以此类推
-
其他函数:
str_repeat :— 重复一个字符串多少次
str_shuffle:随机打乱一个字符串
5.数组类型详解
1. 概念
数组:array,数据的组合,将一组数据存储到指定的容器中,用变量指向该容器,然后通过变量取得容器中的所有数据
2.数组定义
在PHP中有多种定义Array的语法
- 使用array关键字,这也是最常使用 $变量=array (元素1,元素2,元素3,。。。。。)
- 使用中括号:$变量=[元素1,元素2,元素3,…]
- 隐形定义数组:$变量[]=值 $变量[下标]=值
3.数组特点
-
数组的下标可以是数字或者字符串
- 如果数组下标为整数,称之为索引数组
- 如果数组下标为字符串,称之为关联数组
-
不同的下标可以同时存在,称之为混合数组
-
数组元素的顺序以放入顺序为准,与下标大小无关
-
下标的自增长特性:从0开始自动增长,如果手动添加更大的,那么后面自增元素从最大的值+1开始
-
特殊下标的自动转换,不要使用特殊含义的下标
$str[true]=true; $str[false]=false; $str[NULL]=NULL;; //打印结果 array(3) { [1]=> bool(true) [0]=> bool(false) [""]=> NULL }
-
PHP数组中元素没有数据类型限制
-
PHP数组元素没有长度限制
-
PHP数组是很大的数据,所以存储在堆区,为当前数组分配一块连续的空间存储
4.多维数组
-
二维数组
多维数组:数组里面的元素又是数组
-
多维数组
数组中所有的元素都是一样一维数组,但是不建议使用超过三维以上的数组,会增加访问的复杂度,降低访问效率
-
异型数组(不规则数组)
异型数组:数组中的元素不规则,有普通基本变量也有数组,在实际的开发过程中,并不常见,开发过程中尽量让数组元素规则化,便于进行访问
5.数组遍历
1.遍历的基本含义
数组遍历:普通数据的访问都是通过数组元素的下标实现访问,如果说数组中所有的数据都需要依次输出出来,就需要我们使用到一些简化的规则 来实现自动获取下标以及输出数组元素
2.forEach遍历语法
foreach ($userArr as $key => $value) {
$type= gettype($value);
if($type!=="integer"){
$userArr[$key]=mt_rand();
}else{
$userArr[$key]=date("Y-m-d",mt_rand());
}
}
使用forEach进行多维数组的解构
function splitArray($targetArr){
static $i=0,$resultArr;
foreach ($targetArr as $key => $val){
$type=gettype($val);
if ($type ==='array'){
splitArray($val);
continue;
}
$resultArr[$i]=$val;
$i++;
}
return $resultArr;
}
splitArray($dimArr);
//定义一个多维数组
$dimArr=array(
array(1,2,3,4,5,6,7),
array('hello','world','this','is','beautiful'),
array(true,false,NULL),
array(1.2,12.4,19.8,110,time()),
"and grown old",
true,
NULL,
array(
array(1997,mt_rand(),mt_rand()),
'helloworld',
array(time(),'echo'),
),
);
遍历原理:数组内部有一个指针,默认指向数组的第一个元素,利用指针去获取元素,同时移动指针
- foeach会重置指针:让指针指向第一个元素
- 进入foreach循环:通过指针取的当前的第一个元素,然后将下标取出放到对应的变量 k e y 中 , 将 对 应 下 标 对 应 的 值 放 到 key中,将对应下标对应的值放到 key中,将对应下标对应的值放到value中,然后指针下移
- 进入循环体内部,循环开始执行
- 重复执行2和3,直到数组的下标不存在,即为结束
3.for循环遍历数组
- 需要获取数组的长度
- 需要数组下标是规则的数字
- 有一个边界的限定条件
$num= array(1,2,3,4,5,6);
for ($i=0,$len=count($num);$i<$len;$i++){
echo $i,$num[$i],'<br/>';
}
4.while结合each和list
while循环
$i=0;
while ($i<count($num)){
echo $num[$i],"<br/>";
$i++;
}
each函数:返回数组中当前的键/值对并将数组指针向前移动一步,如果最后each取不到结果,则返回false
list函数:不是一种函数,而是一种结构,把数组中的值赋给一组变量
- list不能对字符串起作用
6.数组排序
-
排序函数:对数组元素进行排序,按照ASCII码进行比较,可以进行英文比较
sort:顺序排序(下标重排)
rsort:逆序排序
asort:顺序排序(下标保留)
arsort:逆序排序
ksort:顺序排序:对数组的键名进行排序
krsort:逆序排序,
shuffle:随机打乱数组元素
-
指针函数:
reset:重置指针,将数组指针回到首位
end:重置指针,将数组元素回到最后一个元素
next:指针下移,取得下一个元素的值
prev:指针上移,取的上一个元素的值
current:获取当前指针对应的元素的值
key:获取当前元素对应的下表值
注意事项:next和prev会移动指针,有可能会导致指针移动的最前或者最后(离开数组),导致数组不能使用,通过next和prev不能回到真正准确指针位置,只能通过end和reset进行指针重置
-
其他函数:
count:统计数组中的元素的数量
array_push:往数组中加入一个元素,数组后面
array_pop:从数组中取出一个元素,数组后面
array_shift:从数组中取出一个元素,数组前面
array_unshift:从数组中加入一个元素,数组前面
PHP模拟数据结构:
栈:压栈,先进去后出来(FILO)
队列:排队,先进去的先出去(FIFO)
array_reverse:数组元素颠倒顺序
in_array:判断一个元素是否存在数组中
array_keys:获取一个数组的所有下标,返回一个索引数组
array_values:获取一个数组的所有value值,返回一个索引数组
11.运算符
运算符:operator,是一种将数据进行运算的特殊符号,在PHP中存在数十种。
1.赋值运算符
赋值运算:符号 “=”;
2.算数运算符
算数运算:算数基本操作
+:数据相加;
-:数据相减;
*:数据相乘;
/:数据相除;
%:取余(模)运算,整数相除,保留余数,第二个参数不能为0,0不能作为被除数;
3.比较运算符
通常是比较两个数据的大小,或者两个数据是否相等;
“>”:左边大于右边;
“>=”:左边大于等于右边;
“<”:左边小于右边;
“<=”:左边小于等于右边;
“==”:左右大小相等;
“!=”:左边和右边不同;
“===”:左右大小和类型全部相等;
“!==”:大小或者类型不同;
4.逻辑运算符
逻辑运算:针对不同的结果进行匹配,满足为true,不满足为false;
&& :逻辑与,两边的条件需要同时满足;
| |:逻辑或,左边或者右边的条件有一个满足即可;
!:逻辑非,对已有的条件进行取反;
5.连接运算符
连接运算:将多个字符串进行拼接的一种符号;
. :将两个字符串连接到一起;
.=:符合运算:
a.=b;//a=a.b;
6.错误抑制符
在PHP中有一些错误可以提前预知,但是这些错误无法避免,但是又不希望报错给用户看,可以使用错误抑制符;
@ : 在可能出错的表达式前面使用“@”符号即可;
通常会在生产(上线)环境会用到,在开发(编写代码)过程中一般不会使用;
7.三目运算符
三目运算:有三个表达式参与的计算(简单的分支结构缩写);
语法格式:
表达式1:?表达式2:表达式3
如果表达式1成立,则执行表达式2,否则执行表达式3。表达式2和表达式3都可以是另外的三目运算;
8.自操作运算符
++i:前置操作符,先把自己改变,然后把改变的值,传给别人;
i++:后置操作符,保留自己的值,然后改变自己,把自己原来的值传给别人。
衍生符号
+=: a = a= a=+$b;
“=": a = a= a=a"”$b;
/+: a = a= a=a/$b;
%=: a = a= a=a%$b;
ps:右边十一个整体, a + = a+= a+=b;===> a = a= a=a+($b);如果进行除法或者取余运算,那么考虑右边表达式的结果是否为0(为0就会出错);
9.计算机码
计算机码:计算机在实际存储数据的时候,采用的编码标准(二进制规则);
分为:原码、反码、补码。数据本身最左侧的一位用来充当符号位,0代表正数,1代表负数
原码:数据本身十进制转化二进制得到的结果
正数:最左侧符号位为0;
负数:最左侧符号位为1;
反码:针对负数,符号位不变,其他位置取反;
补码:针对负数,反码加1;
系统中存在两个0;
+0:00000000 原码
-0:10000000 原码
取反:11111111
补码:00000000(+1之后溢出了);
<?php
$a=5;
$b=-5;
echo decbin($a);//00000000 00000000 00000000 00000101
echo "<br/>";
echo decbin($b);//11111111 11111111 11111111 11111011
//-5 原码 10000000 00000000 00000000 00000101
//反码:11111111 11111111 11111111 11111010
//补码:11111111 11111111 11111111 11111011 在反码的基础之上加1
?>
10.位运算
位运算:取出计算机中最小的单位(bit)进行运算;
&:按位与,两个位都为1,结果为1,否则为0;
|:按位或,两个其中一个为1,结果为1,否则为0;
~:按位非,一个位如果为1,则变成0,否则反之;
^:按位异或,两个相同则为0,否则为1,
<<:按位左移,整个位(32位),向左移动一位,右边补0 ,相当于乘于2的操作;
“>>”:按位右移,整个位向右移动一位,左边补符号位对应内容(正数补0,负数补1,相当于除于2 的操作(不完全正确),整数除2会出现小数;
PS:注意
- 系统进行任何位运算的时候都是使用的补码,如果的是正数的情况下,原码和补码是一样的;
- 运算结束之后都必须转换成原码才是最终需要显示的数据;
11.操作符优先级
详情参考PHP运算符优先级
12.流程控制
流程控制:代码的执行方向;
1.控制分类
顺序结构:代码从上往下执行,顺序执行。(代码执行的最基本结构);
分支结构:给定一个条件,同时有多种的可执行代码块,然后根据条件执行某一段代码;
循环结构:在某个条件控制范围内,指定的代码(块)可以重复执行;
1.顺序结构
顺序结构:代码从上往下执行,顺序执行。(代码执行的最基本结构);
2.分支结构
1. If分支
给定一个条件,同事为条件设置多种可执行情况,然后通过条件判断来实现具体的代码执行段;
-
最简单:
if(判断条件){
可执行代码段
}
-
基础If
if(条件表达式){
可执行代码端
}else{
可执行代码段
}
-
复杂If
if(判断条件){
可执行代码段
}else if(判断条件){
可执行代码段
}else{
可执行代码段
}
PS:注意
- 如果条件比较单一(同一个条件),会采用elseif的形式;
- 如果判断条件不一致的,建议使用嵌套的语法(但是不宜嵌套过多);
2.Switch分支
3.循环结构
循环结构:代码段在一定的控制下,可以执行多次;
在PHP中循环结构有以下几种:
for循环:
while循环:
do-while循环:
forEach循环:针对数组
1.for循环
for循环的特殊使用:for循环对应的小括号内(条件)可以一个都没有,就是死循环了,尽量避免这个情况
for(;;){
echo "hello world";
}
for循环的使用案例,PHP输出乘法口诀
for ($i = 1; $i <= 9; $i++) {
for ($j = 1; $j <= $i; $j++) {
echo (string)$j . '*' . (string)$i . '=' . (string)($i * $j) . " ";
if ($i == $j) echo "<br/>";
}
}
2.do-while和while循环
- while循环的使用;
function useWhile()
{
$i = 1;//初始化条件
while ($i <= 10) {
//代码块
echo $i++, "<br/>";//自增运算
}
}
useWhile();
- do-while循环会至少执行一次,然后再去执行循环体
function useDoWhile()
{
$i = 1;
do {
if (!($i % 2)) {
echo $i . "is even", "<br/>";
} else {
echo $i . "is odd", '<br/>';
}
$i++;
} while ($i <= 10);
}
useDoWhile();
2.循环结构流程控制
在循环内部对循环本身进行控制
中断控制:重新开始循环,循环体中还有其他的内容,也再执行
continue:层级默认是1,(循环可以多层嵌套);
function loopControl()
{
$i = 1;
while ($i <= 10) {
$i++;
if ($i % 2) {
echo $i . 'is odd ', "<br/>";
continue;
}
echo $i, "<br/>";
}
}
loopControl();
终止控制
break:层级默认是1
内部循环可以控制到外部,,就是通过使用层级参数
continue2;//当前自己循环后面内部不再执行,同时外部循环如果还有循环体本身也不再执行,重新来过
break2;//当前自己循环结束,同时外部也结束(如果还有外部不受影响,继续执行);
3.流程控制替代语法
PHP本身是嵌入到HTML中的脚本语言,需要在HTML中书写一些关于判断或者循环的结构语法,必须符合PHP的标签规范,需要HTML与PHP进行混搭,如果使用原始的PHP代码,将会非常的不美观;
PHP应该只在HTML中做数据输出,输出通常伴有条件判断和循环操作,因此PHP提供了对应分支结构和循环结构的替代语法:
左大括号"{"使用冒号进行代替;
右大括号"}"使用end+对应的标签名称进行代替;
if: if(): endif;
for: for(): endfor;
switch: switch(): endswitch;
while: while() : endwhile;
//九九乘法表
<table border=1>
<?php for ($i = 1; $i < 10; $i++) {
?>
<tr>
<?php for ($j = 1; $j <= $i; $j++) {
?>
<td>
<?php echo $j . "*" . $i . "=" . $j * $i, "<br/>"; ?>
</td>
<?php } ?>
</tr>
<?php } ?>
</table>
修改版本
<table border=1>
<?php for ($i = 1; $i < 10; $i++) : ?>
<tr>
<?php for ($j = 1; $j <= $i; $j++) : ?>
<td>
<?php echo $j . "*" . $i . "=" . $j * $i, "<br/>"; ?>
</td>
<?php endfor ?>
</tr>
<?php endfor ?>
</table>
13.常用的系统函数
1.输出函数
print():类似echo,本质是一种结构,不是函数,使用结果返回1,可以不用使用括号。
print_r():类似var_dump,但是比var_dump简单,不会输出数据的类型,只会输出值,在数组打印中使用较多。
2.时间函数
date():按照不同的格式对时间戳进行格式化,时间默认是从1970年1月1日开始的(格林威治时间),详情参考PHP开发手册
time():获取当前时间的时间戳
microtime():获取微妙时间的时间戳
strtotime():将字符串时间,转换成unix时间戳
3.数学函数
max():指定参数中最大的值
min():指定参数中最小的值
rand():得到一个区间的随机数
mt_rand():比rand更好,一般使用这个获取
round():四舍五入
ceil():向上取整
floor():向下取整
pow():获取指数值
abs():绝对值
sqrt():
4.“函数”函数
function_exists():判断函数是否存在
func_get_arg():获取指定的参数
func_get_args():获取函数的参数列表 ,获取的实参列表
func_num_args():获取函数参数数量,获取的实参列表
14.中文乱码解决
解决方法:
在<?php后面第一行写上
<?php
header("Content-type: text/html; charset=utf-8");
?>
保存后再在浏览器中查看就不会显示乱码了
15.文件加载
1、文件加载原理
-
在文件加载include或者require的过程中,系统会自动将被包含文件中的代码相当于嵌入到当前文件夹中
-
加载位置:在哪里加载,对应的文件代码嵌入的位置就是对应的include的位置
-
在PHP中被包含的文件都是单独编译的
包含的文件执行失败时,那么直接失败,如果是被包含的文件代码出现语法错误,系统会在执行到这个include的时候才会报错
2、include和require的区别
include和include_once的区别:
- include系统碰到一次就会执行执行一次,如果include多次的话,系统会执行多次
- include_once如果多次的话,系统只会执行一次
require和include的区别:本质都是包含文件,唯一的区别在于包含文件的报错形式不一样
- include的报错级别较低,不会影响后续代码的执行
- require的报错级别较高,如果出错将会影响后续代码的执行,相当于是一个阻塞操作
3、文件加载路径
文件加载时候需要指定文件的加载路径才可以保证 PHP可以正确的寻找到对应的文件
加载路径分为两大类
-
绝对路径
从磁盘的根目录开始,本地的绝对路径
Windows:盘符C:/路径/PHP文件
Linux:/路径/PHP文件
从网站的根目录
/:相对于网站主机名字对应的路径,例如
localhost/index.php ---> E:/server/apache/htdocs/index.php
-
相对路径:从当前文件所在目录开始的路径
“.“或者”./”:表示当前文件夹
“…/”:表示上一级目录,当前文件夹的上一层
区别:
- 绝对路径相对来说效率偏低,但是比较安全,路径不会出错
- 相对路径相对效率较高,但是容易出错,因为相对路径会发生改变
4、文件嵌套包含
文件嵌套包含:一个文件包含另一个文件,同时另一个文件又包含了另外一个文件
嵌套包含的时候很容易出现性对路径出错的问题:相对路径会因为文件的包含而改变./和…/的位置会发生改变
16.函数的定义使用
1.函数的定义和调用
函数:function,一种语法结构,将实现某一个功能的代码块封装起来,从而实现代码的复用。函数对应的以下几种关键点,function关键字、函数名、参数、函数体、返回值
基本语法如下
function function_name([参数]){
//函数体
//return 返回值
}
目的:实现代码的可复用性
2.函数命名规范
由数字、字母、下划线组成,但是不能以数字开头
遵循以下规则:函数名称代表相应的使用,有些功能比较复杂,一个单词可能搞不定
- 驼峰法:除了左边第一个单词外,后面所有的单词首字母都大写:getParentData()
- 下划线:单词之间通过下划线连接,单词都是小写:get_user_info()
- 在一个脚本周期中,不允许出现同名函数,通常在一个系统的开发过程中,不会出现同名函数
3.函数参数
1.函数参数
函数参数分为:形参和实参
形参:形式参数,不具备实际意义的参数,是在函数定义时使用的参数,形参是实参的载体
实参:实际参数,具有实际意义的参数,是在函数调用时使用的参数,传入的实参可以是变量或者其他有值的表达式
2.默认值
默认值:default value 指的是形参的默认值,在函数定义的时候,就给形参进行一个初始化赋值,如果在实际调用的过程中没有传入实参,则使用这个默认的形参值进行函数的运算
3.引用传递
实参在调用时会将值赋值给形参,那么实际上使用的就是一种简单的值传递,形参与外部的变量本身没有任何的关联,但是有的时候,我们希望在函数内部可以改变在函数外部定义的变量,这个时候需要告知函数,函数才会在调用的时候去主动获取外部数据的内存地址。这种形式称之为引用传值
语法如下:
function func_name($a,&$b){
//在这里添加&符号,代表的就是引用传值
echo 'helloworld';
}
$a=1;
$b=2;
func_name($a,$b);//在使用的时候$b必须是变量,不可以是确切的数据,否则会报错
**注意:**函数调用的时候,一定要是变量,不可以是确切的数据,否则会报致命的错误。
4.函数体
函数体:大括号里面所有的代码都被称之为函数体
函数体基本上所有的代码都可以实现
- 定义常量
- 定义变量
- 使用流程控制
- 可以调用函数
5.函数返回值
返回值:return,指的是将函数实现的结果,通过return关键字,返回给函数外部(函数调用处),在PHP中所有的函数都有返回值,如果没有使用return关键字,则默认返回值是NULL
- 函数返回值可以是任何的数据类型
- return代表函数执行结束,return直接结束函数
4.可变函数
可变函数:一个变量保存的值刚好是一个函数的名字,那么就可以使用变量来充当函数名称进行使用,可变函数还是使用比较多的
function func_change(){
echo 'helloworld';
}
$name="func_change";
$name();
5.匿名函数
匿名函数:定义时候没有名字的函数,变量保存匿名函数,本质是得到一个对象(Closure)
function(){
echo "helloworld";
}
6.闭包函数
闭包:closure为了使某个函数内部的变量不被释放
header("Content-type:text/html;charset=utf-8");
function closure(){
$name='alex';
echo '我是我是closure函数中的'.$name.'<br/>';
$inner=function () use ($name){
//需要使用use关键字进行变量的使用
echo '我是inner函数中的'.$name."<br/>";
};
$inner();
}
closure();//在调用的过程中,$name已经被释放了
header("Content-type:text/html;charset=utf-8");
function closure()
{
$name = __FUNCTION__;
$inner = function () use ($name) {
echo $name;
};
return $inner;
}
$returnValue = closure();//closure函数执行结束,但是变量并没有得到释放
$returnValue();//返回匿名函数进行调用
17.作用域
作用域:变量、常量能够访问的区域
- 变量可以在普通代码中定义
- 变量也可以在函数中定义
严格来说分为两种,但是在PHP中还定义了严格意义之外的一种
-
全局变量:用户普通定义的变量
所属全局空间,在PHP中只允许在全局空间中使用,理论上函数内部不可使用
脚本周期:知道脚本运行结束
-
局部变量:函数内部定义的变量
所属当前函数空间,在PHP中只允许在当前函数自己内部使用
函数调用:函数执行结束(函数是在栈区开辟独立的运行空间)
-
超全局变量:系统定义的变量(预定义变量,$_POST )
所属超全局空间:没有访问限制,函数内外都可以访问,超全局变量会自动将全局变量归入到 G L O B A L S 中 , GLOBALS中, GLOBALS中,GLOBALS没有作用域限制,可以帮助局部去访问全局变量,但是必须使用数组的方式
如果想在函数内部使用外部变量,除了**$_GLOBALS**外,还可以通过引用传值
PHP中还有一种方式,可是实现全局访问局部、局部也可以的访问全局:***global***关键字
global关键字是一种在函数内部定义变量的一种方式
- 使用global关键字定义的变量,如果在外部全局变量存在相同名称,那么就是同一个变量,指向同一个内存地址
- 使用global定义的变量外部不存在,系统会自动在全局空间定义一个与局部变量同名的全局变量
语法:global 变量名,不可以进行赋值
虽然以上的方式可以实现全局变量和局部变量的 互相访问,但是一般不会这样使用,如果使用的话,也会使用参数的形式进行访问
1、静态变量
静态变量:static,是在函内部定义的函数,使用static进行修饰,用于实现跨函数共享数据的变量,函数运行结束后所有的局部变量都会消失,如果重新运行下一个函数,所有的局部变量都会进行初始化
语法:
function static_func(){
static $a=1;
echo $a." is a static variable";//$a 就是一个static变量
}
static_func();
//函数执行中,遇到static关键字,则会自动跳过static这一行
使用:
- 统计当前函数的调用次数
- 统筹函数多次调用得到的不同结果
18.错误处理
错误处理:指的是系统或者用户在对某些代码进行执行的时候,发现有错误,就会通过错误处理的形式告知程序员
1.错误分类
- 语法错误:parse error,用户编写的代码不符合PHP的代码规范,导致在编译过程中不通过,所以代码不会执行
- 运行错误:runtime error,代码编译通过,但是代码在执行过程中会出现一些条件不满足导致的错误
- 逻辑错误:程序员在书写代码时候不够规范,出现了一些逻辑性的错误,导致代码正常执行,但是得不到想要的结果
2.错误代号
所有看到的错误代码在PHP中都被定义成了系统常量
-
系统错误:
E_PARSE:编译错误,代码不会执行
E_ERROR: fatal error 致命错误,代码会在出错位置停止执行
E_WARNING: 警告错误,不会影响代码执行,但是会得到意想不到的结果
E_NOTICE: 通知错误,不会影响代码运行,只是影响美观
-
用户错误:E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE
用户使用自定义错误触发的时候,会用到的错误代号,系统不会用到
-
其他错误: E_ALL
代表这所有的错误,通常在进行错误控制的时候使用较多,建议在开发过程(开发环境)中使用
所有E开头的错误常量都是一个字节存储,然后每一种错误占据了一个对应的位,如果想进行一些错误的控制,可以使用位运算进行操作,例如:
排除通知级别notice : E_ALL &~ E_NOTICE
只要警告和通知:E_WARNING | E_NOTICE
3.错误触发
- 程序运行时触发:系统根据错误发生后,对比对应的报错信息,输出给用户,主要针对代码的语法和运行时的错误
- 人为触发:知道某些逻辑可能会出错,从而使用对应的判断代码来触发相应的错误提示
可以使用trigger_error(param1,param2)函数对错误进行抛出,第二个错误可以进行设置类型
4.错误显示设置
错误显示设置:那些错误该显示,以及该如何显示
PHP中,有两种方式来设置当前脚本的错误处理
-
PHP的配置文件:全局配置php.ini文件,这种是全局的
display_errors:是否显示错误
error_reporting:显示什么级别错误
-
在PHP脚本代码中去设置:在脚本中定义的配置项级别高于php.ini配置文件,所以我们一般需要在脚本中进行设置
-
error_reporting(): 设置对应的错误显示级别
-
ini_set():ini_set(“配置文件的配置项”,配置项的值)
ini_set('error_reporting',E_ALL); ini_set('display_errors',on);//设置1也是可以的
-
5.错误日志设置
在实际生产环境中,不会直接让错误赤裸裸的展示给用户
- 不友好
- 不安全:会暴露网站的很多信息,路径、文件名
所以在生产环境中,一般不会显示错误,但是不可避免的会出现错误,这个时候不希望看到,但是又希望铺捉到可以让后台程序员进行修改,需要在PHP配置文件中或者ini_set()设置对应的error_log配置项
error_log配置项
-
开启日志功能
-
指定路径
6.自定义错误处理
最简单的错误处理:trigger_error()
但是我们还可以通过set_error_handler()函数进行自定义报错处理
function myErrorHandler($errno, $errstr, $errfile, $errline,$errcontext)
{
if (!(error_reporting() & $errno)) {
return false;
}
switch ($errno) {
case E_USER_ERROR:
echo " Fatal error on line $errline in file $errfile";
break;
case E_USER_WARNING:
echo "Warning in file".$errfile.'on line '.$errline.'<br/>';
break;
case E_USER_NOTICE:
echo "Notice in file".$errfile.'on line '.$errline.'<br/>';
break;
default:
echo "<b>Unknown error type:</b> in file".'<b>'.$errfile.'</b>'.' on line '.$errline.'<br/>';
break;
}
return true;
}
echo $a;
set_error_handler("myErrorHandler");
echo $a;
19.编程思想
编程思想: 利用数学模式,来解决对应的需求问题,然后用代码来实现对应的数据模型
算法:使用代码实现对应的数学模型,从而解决对应的业务问题
1.递推算法
一种比较简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法。分为顺推和逆推两种
顺推:通过最简单的条件,然后逐步推演结果
逆推:通过结果找到规律,然后推到已知条件
-
菲波那切数列
//for 循环 function fiqSequence($site) { if($site===1|| $site===2)return 1; $fiq_sequence[0]=1; $fiq_sequence[1]=1; for ($i=2;$i<$site;$i++){ $fiq_sequence[$i]=$fiq_sequence[$i-1]+$fiq_sequence[$i-2]; } return $fiq_sequence[$site-1]; } print_r(fiqSequence(20));
2.递归算法
递归算法:把问题转化为规模缩小了的同类问题的子问题,然后递归调用函数来表示问题的解
- 简化问题:找到最优子问题
- 函数自己调用自己
递归思想比较重要的两点:
- 递归点:发现当前问题可以有解决当前问题的函数,去解决规模比当前小一点的问题来解决
- 递归出口:当问题解决的时候,已经到达最优子问题,不能再次调用函数
- 如果一个函数递归调用自己没有递归出口那就是死循环
递归的本质就是函数调用函数:一个函数需要开辟一块内存空间,递归会n次的调用自己,递归的本质就是利用空间换取时间
function fiqSequence($n){
if($n===1||$n===2) return 1;
return fiqSequence($n-1)+fiqSequence($n-2)
}
fiqSequence(5);
3.数组冒泡排序
冒泡排序:bubble sort,是一种计算机中的比较简单的排序算法。
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,走访到没有需要交换,工作完成。
冒泡排序思路:
-
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
-
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
-
针对所有的元素重复以上的步骤,除了最后一个。
-
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
//3. 冒泡排序 bubble sort
function bubbleSort($sortArr)
{
//重复找出最大的数
for ($j = 0, $len = count($sortArr); $j < $len; $j++) {
//找出最大的数,越往后面需要循环次数越少
for ($i = 0, $len = count($sortArr); $i < $len - 1- $j; $i++) {
if ($sortArr[$i] > $sortArr[$i + 1]) {
$median = $sortArr[$i];
$sortArr[$i] = $sortArr[$i + 1];
$sortArr[$i + 1] = $median;
}
}
}
return $sortArr;
}
4.选择排序
选择排序:(Selection-sort)是一种简单直观的排序算法。
工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕,是一种比较不稳定的排序方式
$num = array(1, 5, 3, 9, 4, 8, 7, 2, 6);
function selectSort($sortArr)
{
for ($i = 0, $len = count($sortArr); $i < $len; $i++) {
$minIndex = $i;
for ($j = $i + 1; $j < $len; $j++) {
if ($sortArr[$j] < $sortArr[$minIndex]) {
$minIndex = $j;
}
}
if ($minIndex != $i) {
$median = $sortArr[$i];
$sortArr[$i] = $sortArr[$minIndex];
$sortArr[$minIndex] = $median;
}
}
return $sortArr;
}
5.插入排序
插入排序:是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入,ta是稳定排序
-
从第一个元素开始,该元素可以认为已经被排序;
-
取出下一个元素,在已经排序的元素序列中从后向前扫描;
-
如果该元素(已排序)大于新元素,将该元素移到下一位置;
-
重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
-
将新元素插入到该位置后;
-
重复步骤2~5。
function insertSort($sortArr)
{
$len = count($sortArr);
for ($i = 1; $i < $len; $i++) {
$median = $sortArr[$i];//取出一个 比较 的值
for ($j = $i - 1; $j >= 0; $j--) {
if ($sortArr[$j] > $median) {
//比较大小,交换顺序
$sortArr[$j + 1] = $sortArr[$j];
$sortArr[$j] = $median;
} else {
continue;
}
}
}
return $sortArr;
}
6.快速排序
快速排序:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。ta是不稳定的排序
快速排序思想:
- 从数组中选取一个元素(通常是第一个),作为参照对象
- 定义两个数组,将目标数组中剩余的元素与参照元素进行挨个比较,小的放进一个数组,大的放进一个数组
- 第二步执行完成之后,前后的数组顺序不确定,但是可以确定自己的位置
- 将得到小数组按照1-3重复进行操作
- 回溯最小数组
function quickSort($sortArr)
{
$len = count($sortArr);
if ($len <= 1) return $sortArr;//递归出口
$small = $big = array();
for ($i = 1; $i < $len; $i++) {
if ($sortArr[$i] < $sortArr[0]) {
$small[] = $sortArr[$i];
} else {
$big[] = $sortArr[$i];
}
}
$small = quickSort($small);
$big = quickSort($big);
return array_merge($small, array($sortArr[0]), $big);
}
7.归并排序
归并排序:是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
function mergeSort($sortArr)
{
$len = count($sortArr);
if ($len <= 1) return $sortArr;
$midIndex = floor($len / 2);
$left = array_slice($sortArr, 0, $midIndex);
$right = array_slice($sortArr, $midIndex);
//对拆分的左右数组进行无限的拆分排序
$left = mergeSort($left);
$right = mergeSort($right);
$midArray = array();
while (count($left) && count($right)) {
$midArray[] = $left[0] < $right[0] ? array_shift($left) : array_shift($right);
}
return array_merge($midArray, $left, $right);
}
20.查找算法
含义:查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,查找算法是指定实现查找过程中的代码结,就是中大型数组中去快速定位想要的元素
顺序查找:也称为线性查找,从数据结构线性表的一端开始,顺序扫描,依次将扫描到的节点关键字与给定 值k相比较,若相等则表示查找成功,若扫描结束仍没有找到关键字,则扫描失败
function checkOrder($arr,$num){
for ($i=0,$len=count($arr);$i<$len;$i++){
if ($arr[$i]===$num){
return true;
}
}
return false;
}
二分查找:当我们要从一个序列中查找一个元素的时候,二分查找是一种非常快速的查找算法,二分查找又叫折半查找。它对要查找的序列有两个要求,一是该序列必须是有序的(即该序列中的所有元素都是按照大小关系排好序的,升序和降序都可以,本文假设是升序排列的),二是该序列必须是顺序存储的。
function halfSeek($arr, $num)
{
$low = 0;//左边边界
$high = count($arr);//右边边界
/*
* 当low 小于等于high的时候代表依然有可查找元素
*/
while ($low <= $high) {
$mid = floor(($low + $high) / 2);
if ($arr[$mid] === $num) {
return $mid;
} elseif ($arr[$mid] < $num) {
//中间值小于 当前值
$low = $mid + 1;
} elseif ($arr[$mid] > $num) {
//中间值大于 当前值
$high = $mid - 1;
}
}
return -1;
}