很久之前自己整理的PHP基础知识,小白建议收藏
删除变量 unset(变量名);
变量命名规则
在PHP中变量名必须以$符号开头; 名字由字母、数字和下划线“_”构成,但是不能以数字开头; 在PHP中本身还允许中文变量,但是不建议使用。
预定义变量
$_GET:获取所有表单以GET方式提交的数据 $_POST:POST提交的数据都会保存在此 $_REQUEST:GET和POST提交的都会保存 $GLOBALS:PHP中所有的全局变量 $_SERVER:服务器信息 $_SESSION:session会话数据 $_COOKIE:cookie会话数据 $_ENV:环境信息 $_FILES:用户上传的文件信息
可变变量
如果一个变量保存的值刚好是另外一个变量的名字,那么可以直接通过访问一个变量得到另一个变量的值 ,在变量前面多加一个$符号
变量传值
将一个变量赋值给另外一个变量
变量传值一共有两种方式
值传递:将变量保存的值赋值一份,然后将新的值给另外一个变量保存(两个变量没有关系)
引用传递:将变量保存的值所在的内存地址,传递给另外一个变量;两个变量指向同一块内存空间(两个变量是同一个值)
在内存中,通常有以下几个分区
栈区:程序可以操作的内存部分(不存数据,运行程序代码),少但是快
代码段:存储程序的内存部分(不执行)
数据段:存储普通数据(全局区和静态区)
堆区:存储复杂数据,大但是效率低
常量
常量与变量一样,都是用来保存数据的# #
常量基本定义
常量:const/constant是一种在程序运行当中,不可改量的量(数据)
常量一旦定义,通常数据不可以改变(用户级别)
常量定义形式
在php中常量有两种定义方式
使用定义常量的函数:define(‘常量名’,常量值)
const常量名=值;
常量名字的命名规则
常量不需要使用$符号,一旦使用系统就会认为是变量
常量的名字组成由字母、数字、下划线组成,不能以数字开头
常量的名字通常是以大写字母为主(与变量以示区别)
常量命名的规则比变量要松散,可以使用一些特殊字符,该方式只能使用define定义
define和const定义的常量是有区别的,在于访问权限区别
常量使用形式
常量的使用与变量一样:不可改变值(在定义的时候必须赋值)
访问特殊名字的常量方法:需要用到另外一个访问常量的函数:constant('常量名字');
常量和变量的使用场景
凡数据会可能变化的,使用变量
数据不一定会变的,可以使用常量或变量(变量居多)
数据不允许被修改的,一定用常量
//使用函数定义常量:define define('PI',3.14); //使用const关键词定义 const PII = 3; //定义特殊常量 define('-_-','smile'); //使用常量 echo PI; //使用特殊常量 echo constant('-_-');
系统常量
系统常量:系统帮助用户定义的常量,用户可以直接使用
常用的几个系统常量
PHP_VERSION:php版本号
PHPINTSIZE:整形大小
PHPINTMAX:整形能表示的最大值(PHP中整形是允许出现负数:带符号)
在PHP中还有一些特殊的常量,他们有双下划线开始+常量名+双下划线结束,这种常量称为系统魔术常量:魔术常量的值通常会跟着环境变化,但是用户改变不了
__DIR__:当前被执行的脚本所在电脑的绝对路径 __FILE__:当前被执行的脚本所在电脑的绝对路径(带自己文件的名字) __LINE__:当前所属的行数 __NAMESPACE__:当前所属的命名空间 __CLASS__:当前所属的类 __METHOD__:当前所属的方法
数据类型
数据类型:data type,在PHP中指的是存储数据本身的类型,PHP是一种弱类型语言,变量本身没有数据类型
PHP的八种数据类型
PHP中将数据分为三大类八小类
简单(基本)数据类型:4个小类
整型:int/integer,系统分配4个字节存储,表示整数类型(有前提)
浮点型:float/double,系统分配8个字节存储,表示小数或者整型存不下的整数
字符串型:string,系统根据实际长度分配,表示字符串(引号)
布尔类型:bool/boolean,表示布尔类型,只有两个值:true和false
复合数据类型
对象类型:object,存放对象(面向对象)
数组类型:array,存储多个数据(一次性)
特殊数据类型
资源类型:resource,存放资源数据(PHP外部数据,如数据库、文件)
空类型:NULL,只有一个值就是NULL(不能运算)
类型转化
类型转换:在很多的条件下,需要指定数据类型,需要外部数据(当前PHP取得的数据),转换成目标数据类型
在PHP中有两种类型转化方式:
自动转换:系统根据需求自己判定,自己转换(用的比较多,效率偏低)
强制(手动)转换:认为根据需要的目标类型转换
1) 强制转换规则:在变量之前增加一个括号(),然后在里面写上对应类型:int/integer,其中NULL类型用到unsert()
在转换过程中用的比较多的就是转布尔类型(判断)和转数值类型(算述运算)
$a = 'abc1.1.1'; 值为0;//以字母开头的字符号,永远为0
$b = '1.1.1abc';值为1.1;//以数字开头的字符串,取到碰到字符串为止,不会出现两个字符号
//数据类型 //创建数据 $a = 'abc1.1.1';//以字母开头的字符号,永远为0 $b = '1.1.1abc';//以数字开头的字符串,取到碰到字符串为止,不会出现两个字符号 //自动转化 echo '<br/>', $a + $b; //算述+运算,系统先转换成数值类型,然后运算,前端显示1.1 //强制转换 echo '<br/>' ,(float)$a,(float)$b;//前端显示01.1
类型判断
通过一组类型判断函数,来判断变量,最终返回这个变量所保存数据的数据类型(相同返回true,不同返回false):是一组以is开头后面跟着类型名字的函数:isXXX(变量名) - bool类型不能用echo来查看,可以使用var_dump结构来查看
$a = 'abc1.1.1';//以字母开头的字符号,永远为0 $b = '1.1.1abc';//以数字开头的字符串,取到碰到字符串为止,不会出现两个字符号 var_dump(is_int($a));//false var_dump(is_string($a));//true
还有一组函数可以用来获取以及设定数据(变量)类型
Gettype(变量名):获取类型,得到的是该类型对应的字符串
Settype(变量名,类型):设定数据类型:与强制转化不同
1)强制转换(类型)变量名,是对数据值复制的内容进行处理(不会处理实际存储内容)
2)settype会直接改变数据本身
运算符
赋值运算
赋值运算:符号是=,表示将右边的结果(可以是变量、数据、常量和其它运算出来的结果),保存到内存的某个位置,然后闺怨位置的内存地址赋值给左侧的变量(常量)
算术运算
+:执行数据累加
-:数据相减
*:两个数相乘
/:正斜扛代替,表示两个数相除
%:取佘(模)运算,两个数(整数)相除,保留佘数
算术运算:基本算术操作
在进行除法运算或者取佘运算的时候,对应的被除数(第二个数)不能为0
比较运算符
>:左边大于右边,返回结果true
>=:左边大于等于右边
<:左边小于右边
<=:左边小于等于右边
==:右边等于左边(大小相同)
!=:左边的与右边的不同(大小不同)
===:全等于,左边等于右边,大小以及数据类型都要相同
!==:不全等于,只有大小或者类型不同
比较运算:比较两个数据的大小,或者两个内容是相同,满足返回true,不满足返回false
逻辑运算符
&&:逻辑与,左边的条件与右边的条件同时成立(两边结果都为true)
||:逻辑或,左边的条件或者右边的条件至少有一个满足即可
!:逻辑非,对已有条件进行取反,本身为true,取反结果就是false
$a='weekend'; $b='goods'; //逻辑与 var_dump($a == 'weekend' && $b=='good');//bool(false) //逻辑或 var_dump($a == 'weekend' || $b == 'good');// bool(true) //逻辑非 var_dump($b == 'good');//bool(false) var_dump(!($b == 'good'));// bool(true)
逻辑运算符:针对不同的结果进行匹配
连接运算符
.:将两个字符串连接到一起
.=:复合运算,将左边的内容与右边的内容连接到一起,然后重新赋值给左边变量
//连接运算符 $a = 'hello'; $b = 123; echo $a.$b;//将a变量和b变量连接起来 $a .= $b;//$a = $a.$b echo $a;
连接运算符:是PHP中将多个字符串拼接的一种符号
错误抑制符
@:在可能出错的表达式前面使用@符号
//错误抑制符 $a = 10; $b = 0; @($a % $b);
在PHP中有一些错误可以提前预知,但是这些错误可能无法避免,但是又不希望报错给用户看,可以使用错误抑制符处理
三目运算
由三个表达式参与的运算(简单的分支结构缩写)
语法格式:表达式?表达式2:表达式3
解释:如果表达式1成立,那么执行表达式2,否则执行表达式3,如果表达式比较复杂,建议用括号包起来
三目运算可以进行复合运算:三目运算中表达式2和3都是可以是另外一个三目运算
自操作运算符
++:在原来的值上+1
--:在原来的值上-1
自己操作自己运算,在PHP中自操作符可以放到变量前或者后:前置自操作和后置自操作
后置自操作:先把自己所保存的值留下来,然后改变自己,自己给别人的值是原来的值
前置自操作:先把自己改变,然后把改变后的值给别人
//自操作符 $a = $b = 1; $a++; ++$b;//独立操作,不参与其它运算 echo $a,$b; //2 2 echo $a++,++$b;//$a和$b不只是独立运算,还参与了输出操作 2 3
计算机码
原码:数据本身从十进制转成二进制得到的结果
反码:针对负数,符号位不变,其它位取反
补码:针对负数,反码+0
正数:左边符号为0(正数的原码、反码和补码就是原码本身)
负数:左边符号位为1
计算机码:计算机在实际存储数据的时候,采用的编码规则(二进制规则),分为原码、反码、补码,数值本身最左边一位是用来充当符号位:正数为0,负数为1
流程控制:代码执行的方向
有一组情形存在,通过一个条件,通常有多个值,但是每一个值都会有对应不同的代码要执行
switch判断方式:是将条件放到分支结构内部判断
1、if能做所有的分支结构
switch处理的是条件比较多,同时比较单一,而且是固定的一个值
//分支结构:switch分支 //根据日期做不同的事情 $day = 1; //从1到7做不同的事情 switch($day){ //$day条件一定是具体的值 case 1: echo '1'; break; case 2: echo '2'; break; case 3: echo '3'; break; case 4: echo '4'; break; case 5: echo '5'; break; default: echo 'error'; break; }
if和switch的选择
如果的意思,给定一个条件,同时为该条件设置多种(两种)情况,然后通过条件判断
最简单的if:只有一段代码,但是可以选择是否执行
基础if:有两面性,满足条件或者满足条件都有对应的执行代码
代码为:if(条件表达式){满跳条件所要执行的内容}
if(条件表达式)(满足条件后执行)else(不满足条件执行代码)
在PHP中,分支结构主要有两种:if分支和switch分支
顺序结构:代码从上往下顺序执行(代码执行最基本结构)
分支结构:给定一个条件,同时有多种可执行代码,然后会根据条件执行某一段代码
循环结构:在某个条件控制范围内,指定的代码可以重复执行
控制分类
顺序结构
分支结构
if分支
switch分支
循环结构:代码段在一定的控制下,可以多次执行
1)for循环
//for循环 //从1到10输出:初始为1,结果为10 for ($i=1; $i <= 10; $i++) { echo $i,'<br/>'; }
2)while循环
//定义条件 $i=1; //循环判定执行 while($i<=10){ echo $i++; }
3)do-while:看着像while,首先进行条件判定然后执行循环体,有可能出现第一次就条件不满足,那么就会直接失败。do-while就是先干了再说(执行循环体),然后判断条件(至少会执行一次循环体)
//do-while循环结构 //输出1到10之间的偶数(条件判定加入) //定义基础条件 $i = 1; //循环判定 do{ //执行输出 if($i % 2 !=1){ //偶数 echo $i,'<br/>'; } //条件变更 $i++; }while($i<=10);
for循环:通过条件、起始和终止判断执行
while循环:通过判断条件终止
do-while循环:跟while差不多
foreach循环:专门针对数组
for与while的选择
如果是基于固定已知条件(数值而且是有规律的变化)使用for循环
while可以做灵活的条件判断(while使用的比较多)
因为循环经常性会碰到嵌套(循环中间包含循环)如果在循环内部有些条件下,明确可以知道肖前循环(或者说外部循环)不需要继续执行,那就可以使用循环控制来实现:其中内部循环也可以控制外部,就是通过使用层级参数
continue2:当前自己循环后面内部不再执行,同时外部循环如果还有循环体也不再执行,重新来过
break2:当前自己循环结束,同时外部也结束(如果还有外部不受影响,继续执行)
99乘法表代码
<table border="1"> <?php for($i=1;$i<10;$i++):?> <tr> <?php for($j=1;$j<=$i;$j++):?> <td> <?php echo $i.'*'.$j.'='.$i*$j?> </td> <?php endfor;?> </tr> <?php endfor;?> </table>
php中有哪些替代语法呢?PHP应该 在HTML中只做数据输出,输出通常伴有条件判断和循环操作,因此PHP提供了对应分支结构和循环结构语法:全部都是对应一个模式:
左大括号{使用冒号代替
右大括号}使用end+对应的其实标记替代
文件包含
在一个PHP脚本中,去将另一个文件包含进来,合作完成一件事情。
文件包含的作用
文件包含的意义
1)要么使用包含文件中的内容,实现代码的共享(重用),向上包含 (索要)
2)要么自己有东西可以给别人使用,实现代码的共享(重用),向下包含(给予)
最大作用:分工协作,每个脚本做的事情不一样,因此可以使用协作方式,让多个脚本共同完成一件事情
文件包含四种形式
include:包含文件
include once:系统会自动判断文件包含过程中,是否已经包含过(一个文件最多被包含一次)
require:与include相同
require once:与include once相同
文件加载原理
在文件加载(include或者require)的时候,系统会自动的将被包含文件中的代码相当于嵌入到当前文件中,
加载位置:在哪加载,对应的文件中的代码嵌入的位置就是对应的include位置
include和require区别
include会在页面碰到一次执行一次
include_once不管页面有多少次包含,只执行一次
require一般用于后端程序开发
include一般用于前端HTML
函数
函数基本概念
函数:function,是一种语法,将实现某个功能的代码块(多行代码)封装到一个结构中,从而实现代码的重复利用(复用)
函数定义语法
函数有几个对应的关键点,function关键字、函数名、参数、函数体和返回值
function 函数名(参数){函数体 返回值}
函数的使用:通过访问函数的名字+(),如果函数在定义的过程中有参数,那么在调用的时候必须传入对应的参数,函数是一种结构不会自动行,必须通过调用才会执行
函数是在代码执行阶段,碰到函数名字的时候才会调用,不是在编译阶段
函数的调用特点:只要系统在内存中找到对应的函数,就可以执行(函数的调用可以在调用之前)
//创建函数 function f1(){ echo 'hello world'; } //调用函数 f1();
参数详解
函数参数分为两种:形参和实参
形参:形式参数,不具有实际意义的参数,是在函数定义时使用的参数
实参:实际参数,具有实际数据意义的参数,是在函数调用时使用的参数
默认值:default value,指的是形参的默认值,在函数定义的时候,就给形参进行一个初始赋值:如果实际调用传入的参数(实参)没有提供,那么形参就会使用定义的值来进行入函数内部参与运算,通常默认值是用在一些,一定会有某个数据参与,但是可能通常是某个我们知道的值。
引用传递
实参在调用时会将值赋值给形参,那么实际上使用的方式就是一种简单的值传递:将实参(如果是变量或者常量或者其它表达式)的结果(值)取出来赋值给形参:形参与外部实际传入的参数本身没有任何关联关系:只是结果一样,有的时候,希望在函数内部拿到的外部数据,能在函数内部改变,那么就要明确告知函数(定义时),函数才会在调用的时候去主动获取外部数据的内存地址,以上这种定义的方式叫做引用传值。
//引用传值 function display($a,&$b){ //修改形参的值 $a = $a*$a; $b = $b*$b; echo $a,'<br/>',$b,'<br/>'; } //定义变量 $a = 10; $b = 5; //调用函数 display($a,$b); echo '<hr/>',$a,'<br/>',$b;
函数作用域
变量能够被访问的区域
变量可以在普通代码中定义
变量也可以在函数内部定义
在PHP中,作用域严格来说分为两种:但是PHP内部还定义一些在严格意义之外的一种,所以总共算三种
全局变量:就是用户普通定义的变量(函数外部定义)
所属全局空间:在PHP中只允许在全局空间使用,理论上函数内部不可使用
脚本周期:直到脚本运行结束(最后一行代码执行完)
局部变量:就是在函数内部定义的变量
所属当前函数空间:在PHP中只允许在当前函数自己内部使用
函数周期:函数执行结束(函数是在本本栈区中开辟独立内存空间运行)
超全局变量:系统定义的变量(预定义变量:$SERVER、$POST)
所属超全局空间:没有访问限制(函数内外都可以访问)
静态变量
静态变量:static,是在函数内部定义的变量,使用static关键字修饰,用来实现跨函数共享数据的变量,函数运行结束所有局部变量都会清空,如果重新运行一下函数,所有的局部变量又会重新初始化
可变函数
当前有一个变量所保存的值,刚好是一个函数名字,那就可以使用变量+()来充当函数名使用
闭包
函数内部有一些局部变量(要执行的代码块),在函数执行之后没有被释放,是因为在函数内部还有对应的函数在引用(函数的内部函数:匿名函数)
仿类型
实际上PHP中不存在的类型,但是通过伪类型可以帮助程序员去更好的查看操作手册从而更方便学习,主要分为两种
mixed:混合的,可以是多种PHP中的数据类型
number:数值的,可以是任意数值的类型(整形和浮点型)
常用的系统函数
有关输出的函数
print():类似于echo输出提供的内容,本质是一种结构(不是函数),返回1,可以不需要使用括号
printr():类假于vardump,但是比var_dump简单,不会输出数据的类型,只会输出值(数组打印使用比较多)
相关时间函数
date():按照指定格式对应的时间戳(从1970年格林威治时间开始计算的秒数),如果没有指定特定的时间戳,那就是当前的时间
time():获取当前时间对应的时间戳
imcrotime():获取微秒级别的时间
有关数学的函数
max():指定定参数的最大值
min():比较两个数中的较小值
rand():得到一个随机数,指定区间的随机整数
mt_rand():与rand一样,只是底层结构不一样,效率比rand高(建议使用)
round():四舍五入
cell():向上取整
floor():向下取整
pow():求指定数字的指定指数次结果
abs():绝对值
sqrt():求平方根
有关函数的函数
function_exists():判断指定的函数名字是否在内存中存在(帮助用户不去使用一个不存在的函数,让代码安全性更高)
funcgetarg():在自定义函数中获取指定数值对应的参数
funcgetargs():在自定义函数中获取所有的参数(数组)
funcnumargs():获取当前自定义函数的参数数量
function test($a,$b){ var_dump(func_get_arg(1)); var_dump(func_get_args()); var_dump(func_num_args()); } function_exists('test')&&test(1,'2',3,4);
错误处理
指的是系统(或者用户)在对某些代码进行执行的时候,发现有错误,就会通过错误处理的形式告知程序员
错误分类
语法错误:用户书写的代码不符合PHP的语法规范,语法错误会导致代码在编译过程中不通过,所以代码不会执行(parse error)
运行时错误:代码编译通过,但是代码在执行的过程中会出现一些条件不满足导致的错误(runtime error)
逻辑错误:程序员在写代码的时候不够规范,出现一些逻辑性的错误,导致代码正常执行,但是得不到想要的结果
错误代号
系统错误
E_PARSE:编译错误,代码不会执行
E_ERROR:fatal error,致命 错误,会导致代码不能正确继续执行(会在出错的位置断掉)
E_WARNING: warning,警告错误,不会影响代码执行,但是可能得到意想不到的结果
E_NOTICE:notice,通知错误,不会影响代码执行
E_ALL:代表着所有的错误(通常 在进行错误控制的时候使用的比较多),建议在开发过程中使用
错误触发
程序运行时触发:系统自动根据错误发生后,对比对应的错误的信息,输出给用户:主要针对代码的语法错误和运行时的错误
人为触发:知道某些逻辑可能会出错,从而使用对应的判断代码来触发响应的错误提示
字符串类型
字符串定义语法
单引号字符串:使用单引号包裹
双引号字符串:使用双引号包裹
引号方式:比较适合定义那些比较短或者没没有结构要求的字符串,如果有结构要求,或者内容超过一行,可以使用以下两种结构定义
nowdoc字符串:没有单引号的单引号字符串
heredoc字符串:没有双引号的双引号字符串
字符串转义
转义的含义:在计算机通用协议中,有一些特定的方式定义的字母,系统会特定处理,通常这种方式都是使用反斜杠+字母(单词)的特性:
:回车换行
PHP在识别转义字符的时候也是使用同样的模式:反斜杠+字母
在PHP中系统常用的转义符号:
':在单引号字符串中显示单引号
":在双引号字符串中显示双引号
:代表回车(理论上是回到当前行的首位置)
:代表新一行
:类似TAB键,输出4个空格
$:在PHP中使用$符号作为变量符号,因此需要特定识别
字符串长度问题,*中文在utf8字符集下占3个字节
基本函数strlen():得到字符串的长度(字节为单位)
字符串相关函数
转换函数:implode()、explode()、str_split()
implode(连接方式,数组):将数组中的元素按照某个规则连接成一个字符串
explode(分割字符,目标字符串):将字符串按照某个格式进行分割,变成数组
str_split(字符串,字符长度):按照指定长度拆分字符串得到数组
截取函数:trim(),ltrim(),rtrim()
trim():本身默认是用来去除两边的空格(中间不行),但是也可以指定要去除的内容,是按照指定的内容循环去除两边有的内容:直到碰到一个不是目标字符为止
ltrim():去除左边的
rtrim():去除右边的
截取函数:substr(),strstr()
substr(字符串,起始位置从0开始,[长度]):指定位置开始截取字符串,可以截取指定长度(不指定到最后)
strstr(字符串,匹配字符):从指定位置开始,截取到最后(可以用来取文件后缀名)
大小转换函数:strtolower(),strtoupper(),ucfirst()
strtolower():全部小写
strtoupper():全部大写
ucfirst():首字母大写
查找函数:strpos(),strrpos()
strpos():查找字符串中首次出现的位置
strrpos():查找字符串中最后一次出现的位置
替换函数:str_replace(需要换的字符串,换成什么字符串,字符串本身(数组))
将目标字符串中目标字符串进行替换
格式转换函数:printf(),sprintf()
printf/sprinft(输出字符串有占位符,顺序占位内容……):格式化输出数据
//格式化输出 $age = 50; $name = tom; echo sprintf("你好,今年我%d岁,我叫%s",$age,$name);
其它:strrepeat(),strshuffle()
str_repeat():重复某个字符串N次
str_shuffle():随机打乱字符串
$str = 'abcdefg'; echo str_repeat($str,5),'<br/>'; echo str_shuffle($str);
数组
数组的概念
数组:array,数据的组合,指将一组数据(多个)存储到一个指定的容器,用变量指向该容器,然后可以通过一次性得到该容器的数据
数组定义语法
使用array关键字,$变量 = array(元素1,元素2,元素3)
可以使用中括号来包裹数据,$变量 = [元素1,元素2]
隐形定义数据:给变量增加一个中括号,系统自动变成数组,$变量[]=值1,$变量[下标] = 值;
PHP数组特别
可以整数下标或者字符串下标
如果数组下标都为整数:索引数组
如果数组下标都为字符串:关联数组
不同下标可以混合存在:混合数组
数组元素的顺序以放入顺序为准,跟下标无关
数字下标的自增长特性:从0开始自动增长,如果中间手动出现较大的,那么后面的自增长元素从最大的值+1开始
特殊值下标的自动转换
布尔值:
NULL:
PHP中数组元素没有类型限制
PHP中数组元素没有长度限制
多维数组
数组里面的元素又是数组
二维数组
数组中所有的元素都是一维数组
//定义二维数组 $info = array( array('name' => 'jim','age' => 30), array('name' => 'tom','age' => 28), array('name' => 'lily','age' => 20) ); echo '<pre>'; print_r($info);
多维数组
在二维数组元素中可以继续是数组,在PHP中没有维度限制
不建议超过三维以上的数组,会增加访问复杂度,降低访问效率
异形数组(不规则数组)
数组中的元素规则,有普通基本变量也有数组
在实际开发中,并不常用,尽量让数组元素规则化(便于进行访问)
数组遍历
普通数组访问都是通过数组元素的下标来实现访问,如果数组中所有的数据都需要依次输出出来,就需要我们使用一些简化的规则来实现自动获取下标及输出数组元素
遍历语法
基本语法:如果是关联数组(字母下标),就需要下标,如果是数字下标就直接访问值
//PHP数组遍历:foreach //定义数组 $arr = array(1,2,3,4,5,6,7,8,9,10); foreach ($arr as $k => $v) { echo $v; }
foreach遍历原理
foreach遍历原理:本质是数组的内部有一个指针,默认是指向数组元素的第一个元素,foreach就是利用指针去获取数据,同时移动指针
foreach会重置指针:让指针指向第一个元素
进入foreach循环:通过指针取得当前第一个元素,然后将下标取出放到对应的下标变量中(如果存在),将值取出来放到对应的值变量$v中
进入到循环内部,开始执行
for循环遍历数组
基于已知边界条件(起始和结束)然后有条件的变化(规律),因此for循环遍历数组对应条件
获取数组长度:count(数组)得到数组元素长度
要求数组元素的下标是规律的数字
while配合each和list遍历数组
while是在外部定义边界条件,如果要实现可以和for循环
each函数使用:each能够从一个数组中获取当前数组指针所指向的元素的下标和值,拿到之后将数组指针下移,同时将拿到的元素下标和值以一个四个元素的数组返回
如果each取不到结果,返回false
LIST函数使用
list是一种结构,是一种函数(没有返回值),是list提供一堆 变量去从一个数组中取得元素值,然后依次存放到对应的变量当中
编程思想
递推算法求斐波那契数列
//1 1 2 3 5 8 13 function my_s($des){ if($des==1 || $des==2) return 1; $f[1]=1; $f[2]=1; for($i=3;$i<=$des;$i++){ $f[$i]=$f[$i-1]+$f[$i-2]; } return $f[$des]; } echo my_s(15);
递归思想
递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数来表示问题的解
递归思想中,有两个非常重要的点
递归点:发现当前问题可以解决当前问题的函数,去解决规模比当前小一点的问题来解决
递归出口:当问题解决的时候,已经到达(必须)最优子问题,不能再次调用函数
//递归思想 function recursion($n){ //递归出口 if($n==1||$n==2) return 1; //递归点:求N的值与求N-1的值一模一样,只是N-1的规模比N小 return recursion($n-1)+recursion($n-2); } echo recursion(15);
冒泡排序
//数组排序算法:冒泡排序 $arr= array(1,3,5,2); for($i=0,$len=count($arr);$i<$len;$i++){ for($j=0,$len=count($arr);$j<$len-1-$i;$j++){ if($arr[$j]>$arr[$j+1]){ $temp=$arr[$j]; $arr[$j]=$arr[$j+1]; $arr[$j+1]=$temp; } } } echo '<pre>'; print_r($arr);
归并算法
//PHP数组排序算法:归并算法 $arr1=array(1,3,5); $arr2=array(2,4,6); $arr3=array(); while (count($arr1)&&count($arr2)) { $arr3[]=$arr1[0]<$arr2[0] ? array_shift($arr1):array_shift($arr2); } //合并结果 echo '<pre>'; print_r(array_merge($arr3,$arr1,$arr2));
选项框
复选框
需在name值后面加上[],checkbox
细节:在PHP接收使用复选框(单选框)数据的时候,应该先判断是否存在该数据
单选框
name值必须一样,radio
多选框
-存数据之前, implode(数组,‘分隔符’) - 取数据,explode(‘分隔符’,数组)
文件上传
文件从用户本地电脑通过传输方式保存到服务器所在电脑指定的目录下
enctype属性:enctype='multipart/form-data'
用$_files接收图片
文件上传函数
function upload_aingle($file,$allow_type,$path,&$error,$allow_format=array(),$max_size=2000000){ //判断文件是否可以上传 if(!is_array($file)||!isset($file['error'])){ //文件无效 $error='上传文件不是一个有效的上传文件'; return false; } //判断文件存储路径是否有效 $(!is_dir($path)){ //路径不存在 $error='文件路径不存在'; return false; } //判断文件上传过程是否有错 switch ($file['error']){ case 1: case 2: $error='文件超出服务器允许大小'; return false; case 3: $error='文件上传过程中出现问题,只上传一部分'; case 4: $error='用户没有选中要上传的文件'; return false; case 6: case 7: $error='文件保存失败'; return false; } //判断MIME类型 if(in_array($file['type']),$allow_type){ //该文件类型不允许上传 $error='当前文件类型不允许上传!'; return false; } //判断后缀是否允许 //取出后缀 $ext=ltrim(strrchr($file['name'],'.'),'.'); if(!empty($allow_format)&&!in_array($ext,$allow_format)){ //不允许上传 $error='当前文件格式不允许上传'; return false; } //判断当前文件大小是否满足当前需求 if($file['size']>$max_size){ //文件过大 $error='当前上传的文件超出大小,大小为'.$max_size.'字节!'; return false; } //构造文件名字 $fullname=strstr($file['type'],'/',TRUE).date('YYYYmmdd'); //产生随机字符串 for($i=0;$i<4;$i++){ $fullname.=chr(mt_rand(65,90)); } //拼凑后缀 $fullname.='.'.$ext; //移动到指定目录 if(!is_uploaded_file($file['tmp_name'])){ //文件不是上传的 $error='错误,不是上传文件!'; return false; } //移动指定文件 if(move_uploaded_file($file['tmp_name'], $path.'/'.$fullname)){ //成功 return $fullname; }else{ //移动失败 $error='文件上传失败'; return false; } }
扫一扫,关注我们