一、变量定义
<?php
//变量定义
$var1;
$var2 = 1;
$var1 = 2;
echo $var2,'<br/>',$var1,'<br/>';
unset($var1);//删除变量
//变量传值
$a = 'b';
$b = 'Hello world!';
echo $$a,'<br/>';
//常量定义
define('P1',1);//函数定义
const P2 = 2;//关键字定义
echo P1;
//两种定义方式访问权限有区别
define('-_-','smile');
echo '<br/>',constant('-_-');//特殊符号不能直接使用
//特殊常量
/*在PHP中还有一些特殊的常量,他们有双下划线开始+长两名+双下划线结束,这种常量称
之为系统魔术常量:魔术常量的值通常会跟着环境变化,但是用户改变不了。
__DIR__:当前被执行的脚本所在电脑的绝对路径
__FILE__: 当前被执行的脚本所在的电脑的绝对路径(带自己文件的名字)
__LINE__:当前所属的行数。
__NAMESPACE__: 当前所属的命名空间。
__CLASS__:当前所属的类+
__METHOD__:当前所属的方法。
*/
echo '<br/>',__DIR__,'<br/>',__FILE__,'<br/>',__LINE__,'<br/>',__LINE__;
echo '<br/>',__LINE__;
//数据类型,PHP是一种弱类型语言,变量本身没有数据类型
/*在PHP中将数据分为三大类八小类:
简单(基本)数据类型: 4个小类。
整型: int/integer, 系统分配4个字节存储,表示整数类型(有前提)。
浮点型: float/double, 系统分配8个字节存储,表示小数或者整型存不下的整数。
字符串型: string, 系统根据实际长度分配,表示字符串(引号)小
布尔类型: bool/boolean, 表示布尔类型,只有两个值: true 和falses
复合数据类型: 2个小类。
对象类型:object,存放对象(面向对象)。
数组类型:array,存储多个数据(- -次性)
特殊数据类型: 2个小类。
资源类型: resource,存放资源数据(PHP外部数据,如数据库、文件)和
空类型: NULL, 只有一个值就是NULL (不能运算) 4*/
//类型转换
/*1.自动转换 2.强制转换:(转换类型)需转换变量 (int)$a;*/
echo '<hr/>';
$a = 'abc1.1.1';
$b = '1.1.1abc';
echo '<br/>','<br/>',$a+$b;//自动转换
echo '<br/>',(float)$a,'<br/>',(float)$b;//强制转换
//类型判断
//var_dump()方法是判断一个变量的类型与长度,并输出变量的数值,如果变量有值输的是变量的值并回返数据类型
//用var_dump里面的变量必须是存在的,如果变量存在但值是空的就会返回false;没有变量则返回NULL
echo '<hr/>';
var_dump(is_int($a));
var_dump(is_string($a));
//gettype(变量名):获取变量类型
//settype(变量名,'数据类型'):改变数据类型
echo '<hr/>',gettype($a),'<br/>';
settype($a,'int');
// var_dump(settype($a,'int'));
echo Gettype($a);
echo '<hr/>';
//整数类型
$a1 = 110;//十进制
$a2 = 0b110;//2进制
$a3 = 0110;//8进制
$a4 = 0x110;//16进制
echo $a1,'~',$a2,'~',$a3,'~',$a4,'<hr/>';//php中默认输出为10进制
//进制转换,利用内置函数
/*
1、2进制转换为10进制函数:bindec(str),反过来10进制转换为2进制:decbin(str)
2、8进制转换为10进制函数:octdec(str),反过来10进制转换为8进制:decoct(str)
3、16进制转换为10进制函数:hexdec(str),反过来10进制转换为16进制:dechex(str);这个函数会自动忽略字符中的非16进制字符.返过来10进制转换为16进制:dechex(str)
4、任意进制转换函数:base_convert(参数1,参数2,参数3)
参数1要转换的数字,参数2数字本身的进制,参数3要转为的目的进制
*/
//浮点类型
$f1 = 1.23;
$f2 = 1.23e10;
$f3 = PHP_INT_MAX + 1;//整形超出自身存储大小会用浮点型表示
var_dump($f1,$f2,$f3);
echo '<hr/>';
//运算符(PHP中有10中)
/*
赋值运算符:
赋值运算,符号为 = :
算术运算符:+;-;*;/;%:取余
比较运算:>;<;>=;<=;
==:大小相等
!=:大小不相等
===:(全等于),大小及数据类型均相同
!===:不全等
逻辑运算符:&&(与);||(或);!(非)
连接运算符:
. :将两个字符串连接到一起($a.$b)
.= :复合运算($a.=$b等于$a = $a.$b)
错误抑制符:在PHP中有一些错误可以提前预知,但是这些错误可能无法避免,
但是又比希望报错给用户看,可以使用错误抑制符处理
@:在可能出错的表达式前面使用@符号即可。
三目运算符:
表达式1 ? 表达式2 : 表达式3;
运算:表达式1成立,则执行表达式2;否则执行表达式3
自操作运算:
++;--
衍生符号:+=;-=;*=;/=;%=
*/
$a = 10;
$b = 0;
//$a / $b;
@($a /$b);
echo '<hr/>';
//位运算符:位运算:取计算机中最小单位(位bti)进行运算
/*
&:按位与,两个位均为1,结果为1,否则为0
|:按位或,两个有一个为1,结果为1
~:按位非,一个位如果为1则变成0,否则反之。
^:按位异或,两个相同则为0,不同则为1
<<:按位左移,整个位(32位),向左移动一位,右边补0v
>>:按位右移,整个位向右移动一位,左边补符号位对应内容(正数补0,负数补1) v .
*/
$a = 5;
$b = -5;
var_dump($a & $b);
/*
5原码: 00000101
-5原码:11111011
& : 00000001 (最终结果)
转换为原码:判断符号位,0正数(原码),1负数(补码)
*/
var_dump($a>>1);//右移一位
var_dump($a>>2);//右移两位
//运算符优先级
?>
二、循环结构
<?php
//if分支
/*if(){
}elseif(){
}elde{
}
*/
//switch分支
/*switch(条件表达式($a)){
case 值1: //$a == 值1
执行代码段;
break;
case 值2:
执行代码段;
break;
default:
匹配失败代码段;
break;
}
*/
//循环结构
/*for循环:
for(条件表达式1;条件表达式2;条件表达式3){
循环体
}
while循环:
while(条件表达式){
循环体
}
do while循环:
do{
循环体
}
while(条件表达式);
*/
for($i = 1;$i<=10;$i++){
echo $i,' ';
}
echo '<br/>';
$i = 1;
while($i<=10){
echo $i,' ';
$i++;
}
echo '<br/>';
do{
$i--;
echo $i,' ';
}while($i>1);
//循环控制
/*因为循环经常性会碰到嵌套(循环中间包含循环),如果在循环内部有些条件下,明确可以
知道当前循环(或者说外部循环)不需要继续执行了,那么就是可以使用循环控制来实现:
其中内部循环也可以控制到外部,就是通过使用层级参数。
Continue 2; 当前自己循环后面内部不再执行,同时外部循环如果还有循环体也不再执行,重新来过;
Break 2;当前自己循环结束,同时外部也结束(如果还有外部不受影响,继续执行p。
*/
?>
<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 }?>
</tr>
<?php }?>
</table>
<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
//流程控制代替语法
/*
if: if(){} if(): endif;
switchi: switch(){} switchi(): endswitch;
for: for(){} for(): endfor;
while foreach同理
*/
//文件加载
include_once 'index.php';//默认当前目录
/*
./ 当前目录
../ 上一级目录
*/
?>
三、函数
<?php
//输出函数
print('Hello world!<br/>');
echo print('Hello world!<br/>');
$a = 'Hello world<br/>';
print_r($a);//类似var_dump(),不输出数据类型
//时间函数
echo date('Y年m月d日 H:i:s',123456789),'<br/>';//123456对应的时间
echo time(),'<br/>';
echo microtime(),'<br/>';
echo('------------------------');
//函数
/*
定义:
function 函数名(参数){
函数体;
}
*/
test();
function test($a='分割线'){
echo '</br>-----',$a,'-----</br>';
}
/*
参数详解
形参:形參:形式參数,不具有实际意义的参数,是在函数定义时使用的参数+
实参:实参:实际参数,具有实际数据意义的参数,是在函数调用时使用的参数。
形参是实参的载体:实参在调用时通常是需要传入到函数内部参与计算(运算),那么需要
在函数内部去找到实际数据所在的位置才能找到数据本身:需要实际调用的时候,将数据以
实参的形式传递给形参:给形参赋值,从而使得函数内部可以用到外部数据。。
默认值:
引用传递:在传入数据时必须传入变量。只有变量能够引用传递
function 函数名(形参1,&形参2){
函数体;
}
*/
$c = 2;
echo add(1,1),'</br>';
echo add($c,1);
function add($a,$b){
return $a + $b; //renturn后函数体不执行,直接结束
}
test();
jian(2,1);
echo '-----';
jian();
function jian($a=1,$b=1){
echo $a-$b,'</br>';
}
test();
function display($a,&$b){
$a = $a*$a;
$b = $b*$b;
echo $a,'---',$b;
}
$a = 10;
$b = 3;
display($a,$b);
echo '</br>',$a,'---',$b,'</br>';
test();
//作用域
//默认代码空间:全局空间
$global = 'global area'; //最终会被系统 纳入到超全局变量:$GLOBALS['global']中
$a = 11;
function area(){
$inner = 1; //局部变量,外部无法访问;
global $inner2;//利用global实现局部和全局互访;
$inner2 = 1;
//echo $global;//无法访问全局变量
echo $GLOBALS['global'],'---',$GLOBALS['a'],'</br>';
}
//如果想函数内部使用外部变量:除了$GLOBALS之外,通过参数传值( 如果要统一战线还可以使用引用传值)。4 .
area();
echo $inner2;
test();
//静态变量 static $*;
function sta(){
$a = 1;
static $b = 1;
echo $a++,'---',$b++,'</br>';
}
sta();
sta();
sta();
//可变函数
test('可变函数');
function f1(){
echo __FUNCTION__;
echo '------可变函数-----';
}
$func = 'f1';
$func();//可变函数
test();
//将一个用户定义的函数传入给另外一个函数(函数名)去使用的
//过程,称之为回调过程,而被传入的函数称之为回调函数
function fun1($a,$b){
return $a($b);
}
function fun2($a){
return $a*$a;
}
echo fun1('fun2',10);
test('匿名函数');
$funcn = function(){
echo '我是匿名函数</br>';
};
$funcn();
test('闭包函数');
function funb(){
$name = __FUNCTION__;
$innerfun = function() use($name){//use就是将外部变量保留给内部
echo $name,'--';
};
$innerfun();
}
funb();
?>
四、文件加载原理
//test.php
<?php
echo 'Hello,world!','</br>';
echo '-------------</br>';
$a=1;
define('b','3.14');
?>
<?php
//文件加载原理
include 'test.php';
echo $a,'----',b;
include_once 'test.php';
echo '-------';
require 'test.php';
//require和include区别:
/*
include要求较低:如果包含出错,后续代码继续执行。
Require要求较高:如果包含出错,后续代码不再执行。
*/
//路径加载(绝对路径/相对路径)
/*
./ :当期那文件夹
../ :上一文件夹
*/
//文件嵌套包含
test('ss');
?>
五、错误处理
<?php
function f($a='分割线'){
echo '</br>-----',$a,'-----</br>';
}
/*伪类型主要有两种:在三大类八小类之外。
Mixed:混合的,可以是多种PHP中的数据类型。
Number:数值的,可以是任意数值类型(整形和浮点型)。*/
//函数
//有关数学函数
/*max():指定参数中最大的值←
min():比较两个数中较小的值。
rand):得到一个随机数,指定区间的随机整数+
mt rand):与rand一样,只是底层结构不一样,效率比rand高(建议使用)。
round():四舍五入小
ceil):向上取整+
floor():向下取整。
pow():求指定数字的指定指数次结果: pow(2,8) == 2^8 == 256+
abs():绝对值←
sgrt():求平方根*/
/*有关函数的函数
function_exists():判断指定的函数名字是否在内存中存在(帮助用户不去使用-一个不存在的
函数,让代码安全性更高)。
func_get_arg(): 在自定义函数中去获取指定数值对应的参数+
func_get_args(): 在自定义函数中获取所有的参数(数组)。
func_num_args(): 获取当前自定义函数的参数数量+*/
//错误处理
/**错误分类
* 一、语法错误
* 二、运行时错误
* 三、逻辑错误
*/
/**错误代码
* 一、系统错误
* E_PARSE: 编译错误,代码不会执行。
* E_ERROR: fatal error,致命错误,会导致代码不能正确继续执行(出错的位置断掉)。
* E_WARNING:warning,警告错误,不会影响代码执行,但是可能得到意想不到的结果。
* E_N0TICE: notice, 通知错误,不会影响代码执行。
* 二、用户错误
* E_ _USER_ ERROR, E_ USER_ _WARNING, E_ USER_ _NOTICE。
* 用户在使用自定义错误触发的时候,会使用到的错误代号(系统不会用到)。
* 三、其他
* E_ ALL,代表着所有从错误(通常在进行错误控制的时候使用比较多),建议在开
* 发过程中(开发环境)使用。
*
* 所有以E开头的错误常量(代号)其实都是由一个字节存储,然后每一种错误占据一个对应
* 的位,如果想进行- -些错误的控制,可以使用位运算进行操作。
* 例:
* 排除通知级别notice: E_ALL&~E_NOTICE
* 只要警告和通知: E_WARNING|E_NOTICE
*/
/**错误触发 */
header('Content-type:text/html;charset=utf-8');//必备
f();
$a = 1;
$b = 0;
if($b == 0){
//认为触发错误
trigger_error('发生错误');//默认notice,代码会继续执行
// trigger_error('发生错误',E_USER_ERROR);//默认error,代码停止
}
echo $a/$b;
f('错误显示设置');
/**一、PHP的配置文件:全局配置: php.ini 文件。
* Display_ errors:是否显示错误。on/off
* Error_ reporting: 显示什么级别的错误。
* 二、在运行的PHP脚本中设置:在脚本中定义的配置项级别比
* 配置文件高j(通常在开发当中都会在代码中去进行控制和配置)。
* Error reporting(): 设置对应的错误显示级别。
* Ini_set('配置 文件中的配置项,,配置值)。
* Ini_set('error.. reporting'E ALL);
* Ini_set('display_ errors,1);
*/
f('错误日志设置');
/**在实际生产环境中,不会直接让错误赤裸裸的展示给用户:
* 1、不友好。
* 2、不安全:错误会暴露网站很多信息(路径、文件名)、
* 所以在生产环境中,一般不显示错误( 错误也比较少),但是不可能避免会出现错误(测试
* 的时候不会发现所有的问题),这个时候不希望看到,但是又希望捕捉到可以让后台程序员
* 去修改:需要保存到日志文件中,需要在PHP配置文件中或者代码中(ini_set)设置对应
* error_log配置项。
* 1、开启日志功能
* log_errors = On
* 2、指定路径
* error_log = 路径
*/
f('自定义错误处理');
/**最简单的错误处理: trigger_errors()函数,但是该函数不会阻止系统报错。
* PHP系统提供了一种用户处理错误的机制:用户自定义错误处理函数,然后将该函数增加到操
* 系统错误处理的句柄中,然后系统会在碰到错误之后,使用用户定义的错误函数。
* set_error_handler()前两个参数必须存在
*
*
*
*/
function my_error($errno,$errstr,$errfile,$errline){
//判断当前会碰到哪些错误
if(!(error_reporting()&$errno)){
return false;
//error_reporting没有参数代表获取当前系统错误处理对应的级别
}//错误类型库中不存在
//开始判断错误类型
switch($errno){
case E_ERROR:
case E_USER_ERROR:
echo 'fatal error in file'.$errfile.'on line'.$errline.'</br>';
echo 'error info:'.$errstr;
break;
case E_WARNING:
case E_USER_WARNING:
echo 'warning in file'.$errfile.'on line'.$errline.'</br>';
echo 'error info:'.$errstr;
break;
case E_NOTICE:
case E_USER_NOTICE:
echo 'notice in file'.$errfile.'on line'.$errline.'</br>';
echo 'error info:'.$errstr;
break;
}
return true;
}
//修改错误机制
set_error_handler('my_error');//将自定义错误处理加入到系统错误处理句柄中
?>
六、字符串
<?php
header('Content-type:text/html;charset=utf-8');
function f($a='分割线'){
echo '</br>-----',$a,'-----</br>';
}
f('字符串');
$str1 = 'hello';//单引号字符串
$str2 = "hello";//双引号字符串
var_dump($str1,$str2);
//引号方式:比较适合定义那些比较短(不超过一行) 或者没有结构要求的字符串。
//如果有结构要求,或者内容超过一行,可以使用以下两种结构定义。
f();
/**
* nowdoc字符串:没有单引号的单引号字符串
* $str = <<<边界符
* 字符串
* 边界符;
* heredoc字符串:没有双引号的双引号字符串
* $str = <<<边界符
* 字符串
* 边界符;
*
* 结构化定义字符串变量的规则:。
* 1、结构化定 义字符串对应的边界符有条件:
* 1.1上边界符后面不能跟任何内容,包括空格和注释;
* 1.2下边界符必须放在最左边;
* 1.3下边界同样后面只能跟分号,不能跟任何内容;
*
* 2、结构化定义字符串的内部 (边界符之间)的所有内容都是字符串本身
*/
$str3 = <<<EOD
Hello
world
EOD;
//heredoc结构
$str4 = <<<'EOD'
Hello
world
EOD;
//nowdoc结构
var_dump($str3,$str4);
echo $str3,'-------',$str4;
f('结构化规则');
$a = '哈哈';
// $str11 = <<<EOD
// //这是弹出内容
// <script>
// alert('$a');
// </script>
// EOD;
echo $str11;
f('字符串转义');
/**字符串转义
* \' :输出'
* \" :输出"
* \r :代表回车(理论上是回到当前行首位置)
* \n :换行
* \t :类似tab键,输出4个空格
* \$ :输出$
*
* 单引号和双引号区别:
* 1.单引号中可以识别:\' 而双引号中不能识别\'
* 2.双引号中可以识别$,所以可以解析变量
* 解析规则:(1):应保证变量的独立性,不要让系统难以区分
* 错误示范:$str8 = "abc$bdef";
* (2):使用变量专业标识符 {$b} 区分
*/
$str5 = 'abc\r\ndef\'\"\$fg';
$str6 = "abc\r\ndef\'\"\$fg";
echo $str5,'</br>',$str6;
f();
$b = 123;
$str7 = 'abc $b def';
$str8 = "abc $b def";
echo $str7,'</br>',$str8;
f('字符串长度相关');
/**
* (1)基本函数strlen():得到字符串长度(字节为单位)
* (2)多字节字符串的长度问题:包含中文的长度。
* (3)多字节字符串扩展模块: mbstring扩展(mb: Multi Bytes)。
* 首先需要加载PHP的mbstring扩展。配置文件更改
* Mbstring扩展针对的是一些关于字符统计: strlen. 只是针对标准交换码ASCII, mtstring
* 会针对不同的字符集。
* mb_strlen('字符串','字符集');
*/
$strl1 = 'abcdefg';
$strl2 = '哈哈123';//UTF-8下中文占3个字节
echo strlen($strl1),'</br>',strlen($strl2);
echo '<hr/>';
echo mb_strlen($strl1),'</br>',mb_strlen($strl2,'utf-8');
f('字符串相关函数');
/**
* 1)转换函数: implode(), explode(), str. split()o
* Implode(连接方式,数组):将数组中的元素按照某个规则连接成一个字符串
* Explode(分割字符,目标字符串):将字符串按照某个格式进行分割,变成数组
* 中国|北京|顺义== array('中国','北京','顺义');
* Str_split(字符串,字符长度):按照指定长度拆分字符串得到数组。
* 2)去除函数: trim(), ltrim(), rtrim()
* Trim():本身默认是用来去除两边的空格(中间不行),但是也可以指定要去除的内容,是按
* 照指定的内容循环去除两边有的内容:直到碰到一个不是目标字符为至
* ltrim():去除左边的
* rtrim():去除右边的
* 3)截取函数: substr(), strstr()
* Substr(字符串,起始位置从0开始[长度]):指定位置开始截取字符串,可以截取指定长度(不
* 指定到最后)。
* Strstr(字符串,匹配字符):从指定位置开始,截取到最后(可以用来取文件后缀名) .
* 4)大小转换函数: strtolower(), strtoupper(), ucfirst()。
* Strtolower:全部小写
* Strtoupper:全部大写
* Ucfirst:首字母大写
* 5)查找函数
* Strpos():判断字符在目标字符串中出现的位置(首次)。
* Strrpos():判断字符在目标字符串中最后出现的位置。
* 6)替换函数: str_replacel()
* Str_replace(匹配目标,替换的内容,字符串本身):将目标字符串中部分字符串进行替换I
* 7)格式化函数: printf(), sprntf()
* printf/sprntf(输出字符串有占位符)
* %% - 返回一个百分号 %
* %b - 二进制数
* %c - ASCII 值对应的字符
* %d - 包含正负号的十进制数(负数、0、正数)
* %e - 使用小写的科学计数法(例如 1.2e+2)
* %E - 使用大写的科学计数法(例如 1.2E+2)
* %u - 不包含正负号的十进制数(大于等于 0)
* %f - 浮点数(本地设置)
* %F - 浮点数(非本地设置)
* %g - 较短的 %e 和 %f
* %G - 较短的 %E 和 %f
* %o - 八进制数
* %s - 字符串
* %x - 十六进制数(小写字母)
* %X - 十六进制数(大写字母)
* 8)其他: str_repeat(), str_shuffle()
* str_repeat(字符串,n):重复字符串n次
* str_shuffle(字符串):随机打乱字符串
*/
$string1 = ' abCd efDb ';
$string2 = 'hijk';
// f();
var_dump(str_split($string1,3));
f();
var_dump(trim($string1));
f('截取');
echo substr($string1,3,2),'-----',strstr($string1,'e');
f('大小写转换');
echo strtoupper($string1),'-----',strtolower($string1),'-----',
ucfirst($string2);
f('查找函数');
echo strpos($string1,'b'),'-----',strrpos($string1,'b');
f('替换函数');
echo str_replace('b','是',$string1);
f('格式化函数');
$age = 20;
$name = 'TOM';
echo sprintf("你好,我叫%s,今年%d岁",$name,$age);
f('其他');
echo str_repeat($string2,2),'----',str_shuffle($string2);
?>
七、数组
<?php
header('Content-type:text/html;charset=utf-8');
function f($a='分割线'){
echo '</br>-----',$a,'-----</br>';
}
echo '数组</br>';
/**数组的定义方法
* 1、使用array关键字
* $变量 = array(元素1,元素2,..);
* 2、使用中括号来包裹数据
* $变量 = [元素1,元素2,..];
* 3、隐形定义数组,给变量加一个中括号,系统自动变成数组
* $变量[] = 值1;
* $变量[下标] = 值;$a[10] = 1;$a[] = 2;则a[11] = 2;
*/
$arr1 = array('1','2','3','haha');
$arr2 = ['3','2','1','haha'];
var_dump($arr2);
f();
$arr3[] = 1;
$arr4[5] = 5;
$arr5[] = '1';
$arr6['key'] = 'key';
echo var_dump($arr3),'</br>',var_dump($arr4),'</br>',
var_dump($arr5),'</br>',var_dump($arr6);
f();
/**数组特点
* 1)可以整数 下标或者字符串下标。
* 如果数组下标都为整数:索引数组
* 如果数组下标都为字符串:关联数组
* 2)不同下标可以混合存在:混合数组。
* 3)数组元素的顺序以放入顺序为准,跟下标无关
* 4)数字下标的自增长特性 :从0开始自动增长如果中间手动出现较大的,那么后面的自
* 增长元素从最大的值+1开始
* 5)特殊值下标的自动转换
* 布尔值: true和false --> 1/0
* 空: NULL --> 空
* 6)PHP中数组元素没有类型限制,没有长度限制
* 补充:PHP中的数组是很大的数据,所以存储位置是堆区,为当前数组分配一块连续的内存。
*/
$arry1[false] = 'false';
$arry1[true] = 'true';
$arry1[null] = 'null';
var_dump($arry1);
f('多维数组:数组中的元素又是数组');
/**多维数组
* 二维数组:数组中所有的元素都是一维数组
* 在二维的数组元素中可以继续是数组,在PHP中维数不限,但不建议使用超过三维的数组,
* 会增加访问的复杂度,降低访问效率
*/
$info = array(//二维数组
array('name' => 'Jim','age' => 30),
array('name' => 'Tom','age' => 28),
array('name' => 'Lily','age' => 21)//最后一个元素后面可以不跟 , 号
);
var_dump($info);
/**异形数组
* 异形数组:数组中的元素不规则,有普通基本变量也有数组。
* 在实际开发中,并不常用,尽量让数组元素规则化(便于进行访问)。
*/
f('数组遍历');
/**数组遍历
* 数组遍历:普通数组数据的访问都是通过数组元素的下标来实现访问,如果说数组中所有的
* 数据都需要依次输出出来,就需要我们使用到一些简化的规则来实现自动获取下标以及输出
* 数组元素。
*
* Foreach遍历语法:
* 基本语法如下:
* 基本语法如下:。
* Foreach(数组变量 as $下标 => $值){
* 通过$下标访问元素的下标;通过$值访问元素的值
* }
* 通常:如果是关联数组(字母下标),就需要下标,如果是数字下标
* 在进行数据存储定义的时候,通常二维数组不会两个维度的key下标都为数字,一般是一维
* 为数字(无意义),二维为字符串(数据库表字段),所以在进行遍历的时候,通常是只需要
* 针对一-维进行遍历,取得二维数组元素,然后二维数组元素通过下标去访问。
* Foreach遍历原理.
* Foreach.遍历的原理:本质是数组的内部有一颗指针, 默认是指向数组元素的第一个元素,
* foreach就是利用指针去获取数据,同时移动指针
* 1、foreach, 会重置指针:让指针指向第一-个元瓢
* 2、进入foreach循环:通过指针取得当前第一个元素,然后将下标取出放到对应的下标变
* 量$k中(如果存在),将值取出来放到对应的值变量Sv中; (指针下移)。
* 3、进入到循环内部(循环体),开始执行;
* 4、重复2和3,直到在2的时候遇到指针取不到内容(指针指向数组最后) ψ
*/
$arry2 = array(7,6,5,4,3,2,1);
foreach($arry2 as $i){
echo $i,'---';
}
foreach($arry2 as $k => $i){
echo 'key:',$k,'== ',$i,'<br/>';
}
f('For 循环遍历数组');
/**For 循环遍历数组
* For循环:基于已知边界条件(起始和结束)然后有条件的变化(规律)小
* 因此: for 循环遍历数组有对应条件。
* 1、获取数组长度 : count数组)得到数组元素的长度。
* 2、要求数组下标是规律数组
*/
for($i = 0;$i < count($arry2);$i++){
echo $arry2[$i],'---';
}
f('While配合each和list遍历数组');
/**While配合each和list遍历数组
* While是在外部定义边界条件,如果要实现可以和for循环。4
* Each函数使用: each 能够从一一个数组中获取当前数组指针所指向的元素的下标和值,拿到
* 之后将数组指针下移,同时将拿到的元素下标和值以-个四个元素的数组返回:
* 0标 => 取得元素的下标值
* 1下标 => 取得元素的值
* Key下标 => 取得元素的下标值
* Value下标 => 取得元素的值
*
* List函数使用: list是一种结构,不是一种函数(没有返回值),是list提供一堆变量去从一
* 个数组中取得元素值,然后依次存放到对应的变量当中(变量为变量赋值:值来源于数组):
* list必须从索引数组中获取数据,而且必须从0开始
*
* List与each配合特别好: each一定有两个元素就是0和1下标元素
* List(变量1.变量2) = each(数组); //是一种赋值运算,但是可以得到false 结果(each职
* 不到正确的结果),整个表达式为falsey
*
*/
$a = array(1,'name' => 'TOm',3,'age' => 30);
// echo '<pre>';
// print_r(each($a));
// print_r(each($a));
// print_r(each($a));
// print_r(each($a));
// var_dump(each($a));
$arry3 = array(1,2,3 => 1);
list($first) = $arry3;
var_dump($first);
f();
// while(each($a)){
// list($key,$value) = each($a);
// echo 'key is: '.$key.' value is: '.$value.'<br/>';
// }
//改进
while(each(list($key,$value) = each($a))){
echo 'key is: '.$key.' value is: '.$value.'<br/>';
}
f('数组相关函数');
/**1)排序函数:对数组元素进行排序,都是按照ASCII码进行比较
* sort():顺序排序(下标重排)
* rsert():逆序排序
* asort():顺序排序(下标保留)
* arsort():逆序排序
* ksort():顺序排序;按照键名
* krsort):逆序排序
* shuffle():随机打乱数组元素,下标重排
* 2)指针函数
* reset():重置指针,将指针重回首位,返回值为true/false
* end();重置指针,指针指到最后一个元素
* next():指针下移,取得下一个元素值
* prev():指针上移,取得上一个元素的值
* current(): 获取当前指针对应的元素值
* key()获取当前指针对应下标值
*
* 注意事项: next和prev会移动指针,有可能导致指针移动到最前或者最后(离开数组),导
* 致数组不能使用,通过next和prev不能回到正确的指针位置,只能通过end和resert重置
*
* 3)其他函数
* count():统计数组元素数量
* array_push():在数组中加入一个元素(数组后面)
* array_Pop():在数组中取出一个元素(数组后面)
* array_shift():在数组中取出一个元素(数组前面)
* array_unshift():在数组中加入一个元素(数组前面)
* PHP模拟数据结构:
* 栈:先进后出
* 队列:先进先出
*
* array_reverse():数组元素反过来
* in_array():判断一个元素在数组中是否存在
* array_keys();获取一个数组的所有下边,返回一个索引数组
* array_values():获取一个数组的所有值,返回一个索引数组
*
*/
$sarr = array(4,8,1,3,2,0);
$sort_arr = sort($sarr);
for($i = 0;$i < count($sarr);$i++){
echo $sarr[$i],'---';
}
f('PHP模拟数据结构');
$arr = array();
array_push($arr,3);
array_push($arr,2);
array_push($arr,1);
print_r($arr);
echo '---',array_pop($arr),array_pop($arr),array_pop($arr),'</br>';//栈
$arrt2 = array();
array_unshift($arrt2,3);
array_unshift($arrt2,2);
array_unshift($arrt2,1);
print_r($arrt2);
echo '---',array_pop($arrt2),array_pop($arrt2),array_pop($arrt2);
?>