一、PHP基础
1、php 基本格式,注释,输出
- 注释有多行注释和单行注释,多注释使用
/**/ ,单行使用 // 或 # , 与 C++ 的一样 - 输出使用
echo '输出内容';
在 PHP 的输出中不会自动换行,要想换行可以使用 echo '<br/>'; 也可以使用 echo '<hr/>'; 输出一条分割线
- 一般格式都是
<?php ?> ,但是最后的 ?> 可以不写,但每一行内容都需要使用分号 ; 做分隔符,否则代码会报错
<?php
echo 'Hello world!';
2、变量和常量
2.1 变量
-
变量的定义:使用 ‘$’ 进行定义,如 $a; -
变量的赋值:在定义变量的时候可以直接进行赋值,如 $a = 1; -
变量的删除:php 中变量不使用的时候是可以进行删除的,使用 unset(变量名) 函数进行删除,如 unset($a) -
变量的命名规则: a. 必须以 $ 符号作为开头 b. 变量名由字母,下划线,数字组成,但开头不能是数字 c. php 中允许使用中文变量,但不推荐使用:如 $姓名 = ‘张三’; -
预定义变量:也就是提前定义的变量,是由系统定义的,用来存储许多需要用到的数据,预定义变量都是数组
$_GET : 获取所有表单以 get 方式提交的数据(‘重要’) $_POST : post 提交的数据都会保存在此变量中(‘重要’) $_REQUEST : get 和 post 提交的数据都会保存在此变量中(‘重要’) $_GLOBALS : 获取 php 中所有的全局变量 $_SERVER : 获取服务器信息(‘重要’) $_SESSION : session 会话数据(‘重要’) $_COOKIE : cookie 会话数据(‘重要’) $_ENV : 环境信息 $_FILES : 用户上传的文件信息
- 可变变量:一个变量保存的值刚好是另外一个变量的名字,那么可以直接使用这个变量访问另一个变量的值,只需要在变量名前再加上一个 $ 符号即可
如:$a = b; $b = 3; echo $$a; # 相当于输出的就是 $b, 得到的值是 3
- 变量传值:传值也就是给变量赋值,变量的传值有两种,一种是值传递,一种是引用传递
值传递: 将变量的值直接赋给另外一个变量,两个变量之间互不影响,没有关系 如 $a = 1; $b = $a;
引用传递: 将变量值保存的地址引用给另外一个变量,两个变量共用一个内存,也就是说此时的两个变量是一个值 引用传递需要用到 & 符号,如 $a = 1; $b = &$a; ,此时表示两个变量共用一块内存,当一个变量改变值得时候,另外一个也会随着改变
【举例】
<?php
$num1 = 3;
$num2 = 9;
$str = 'Hello';
echo $num1, '   ', $num2, '   ', $str;
echo '<hr/>';
$a = 1;
$b = "a";
echo $b, '   ', $$b;
echo '<hr/>';
echo $_GET, '   ', $_ENV, '   ', $_SERVER;
2.2 常量
- 常量的命名规则:
a. 常量的定义不需要使用 $ 符号,如果使用了就会被系统认为是变量 b. 常量的命名也是用字母,数字和下划线组成,也不能以数字开头 c. 常量的命名通常采用大写字母命名,用来和变量区分 d. 常量的命名可以使用一些特殊字符,但只能由 define 定义
- 常量的定义:常量的定义与变量相似,但常量必须传值,且常量的值是不能改变的
使用 define 函数定义常量: define(常量名, 常量值, 布尔值); ,如 define('PI', 3.14) define() 函数第三个参数值默认为 false, 作用是定义的常量是否对大小写不敏感,false 表示对大小写敏感
使用 const 定义常量: const 常量名 = 常量值; ,如 const PI = 3.14
定义特殊字符的常量:define('-_-', 'smile') 特殊字符的输出不能直接使用 echo 输出,需要使用 constant() 函数嵌套,如 echo constant('-_-')
- 常用的系统常量:
PHP_VERSION : 获取 PHP 的版本号 PHP_INT_SIZE : 获取整形大小 PHP_INT_MAX : 整形能表示的最大值
- 常用的一些特殊常量:系统魔术常量,随着环境的改变而改变
__DIR__ : 当前被执行的脚本所在电脑的绝对路径 __FILE__ : 当亲被执行的脚本所在电脑的绝对路径(带有文件名字) __LINE__ : 当前所属的行数 __NAMESPACE__ : 当前所属的命名空间 __CLASS__ : 当前所属的类 __METHOD__ : 当前所属的方法
【举例】
<?php
define("PI", 3.14);
define('-_-', 'smile');
const E = 2.71828;
echo PI, '   ', E, '   ';
echo constant('-_-');
echo '<hr/>';
echo PHP_VERSION, '   ', PHP_INT_MAX, '   ', PHP_INT_SIZE;
echo '<hr/>';
echo __DIR__, '<br/>', __FILE__, '<br/>', __LINE__;
3、数据类型
3.1 数据类型介绍
- 基本数据类型:
整形:int/integer, 系统分配4个字节储存,用来储存整数类型,但有一定的范围 浮点型:float/double 系统分配8个字节储存,储存小数或者整形存储不下的数字(超出整形范围的数据) 字符串型:string 系统根据实际长度分配,引号部分的内容 布尔类型:bool/boolean 只有 true /false 两个值
- 复合数据类型:
对象类型:object, 存放对象(面向对象) 数组类型:array, 一次存放多个数据
- 特殊数据类型:
资源类型:resource, 存放资源数据(PHP外部数据,如数据库、文件等) 空类型:NULL, 只有 NULL 一个值(不能用来运算)
3.2 类型判断、类型转换
- 类型判断:
使用类型判断函数判断,类型判断函数的组成是用 ‘is_’ 加上类型名称组成,如 is_int(变量名) ,类型判断返回的值是 bool 类型,即 true/ false
bool 类型不建议使用 echo 进行查看,可以用 ‘var_dump(变量1, 变量2…)’ 查看,var_dump(is_int($a)) var_dump() : 返回的内容由变量类型和变量的值共同组成,如返回一个整形变量的时候,结果是 int(变量值) ,但输出字符串的时候,返回的内容为 变量类型+字符个数+变量值,如 string(5)"hello"
- 类型转换:将数据类型转换为需要的类型,php 中有两种转换方式
自动转换:系统根据需求自己进行转换(效率比较低) 强制转换:自己根据需要对目标进行转换,只需要在变量前面加上一个括号,再写上对应的数据类型即可,如 (int)$a 表示将变量转换为 int 型,其中 NULL 类型转换需要用 unset()
- 在类型转换中,比较多的是转换为 bool 类型和数值类型:
- 空字符串(""), null, 没有赋值的变量, 0, “0” 等内容转换为 bool 类型的结果为 false, 其余的多数为 true
- bool 类型转数值: true 为 1, false 为0;
- 字符串转数值: 以字母(字符)开头的字符串(如 “abc123”)始终为 0, 以数字开头的字符串(如 “123ab”)将数字全部提取出来,但有多个小数点的时候(如 “1.1.2a”), 提取到第二个小数点以前的数据
4、 内容补充:
gettype(变量) : 获取变量数据类型,返回的结果是变量对应的数据类型,如 整形返回 integer settype(变量, 类型) : 设定数据类型,与强制转换有所区别
- 强制转换:只对数据赋值的内容进行处理,不会改变原来的内容和数据类型
- settype(): 直接改变数据的本身,数据类型和内容也随着改变
【举例】
<?php
$str1 = '1.3abc';
$str2 = '1.1.1abc';
$str3 = 'abc12';
$str4 = '_123';
$num = 11;
var_dump(is_int($num), is_string($num));
echo '<br/>';
var_dump($str3, $num);
echo '<hr/>';
$result1 = $str1 + $num;
var_dump($result1);
echo '<br/>';
$result2 = (int)$str1 + $num;
var_dump($result2);
echo '<hr/>';
echo (int)$str3, '  ', (int)$str4, '<br/>';
echo (float)$str2, '<hr/>';
echo gettype($str1), '  ', gettype($num);
echo '<br/>';
var_dump($num);
echo '   ';
settype($num, 'string');
var_dump($num);
3.3 进制转换
1.十进制转二进制:decbin()
2.十进制转八进制:decoct()
3.十进制转十六进制:dechex()
- 将其它类型的进制转换为十进制的时候只需要将函数反过来即可,如二进制转十进制 bindec()
- 定义整形的时候:二进制前面用 0b 开头(如 ob110),八进制用 0 开头(如 0120),十六进制用 0x 开头(如 0x120)
4、 两个函数的使用介绍:
- empty() : 判断数据的值是否为“空”(空不是NULL), 如果为空返回 true, 否则返回 false
- isset() : 判断数据存储的变量本身是否存在,存在返回 true, 否则返回 false
【举例】
<?php
$a = 12;
$b = 0b1010;
$c = 0120;
$c = 0x110;
echo decbin(10), '<br/>';
echo decoct(10), '<br/>';
echo dechex(10), '<br/>';
echo bindec($b), '<hr/>';
$t;
var_dump(empty($a), empty($t));
echo '<br/>';
var_dump(isset($t));
unset($t);
var_dump(isset($t));
3.4 运算符
1.算术运算符:+ - * /
2.比较运算符:> >= < <= == != === !==
- === : 表示全等于,包括数据大小和数据类型
- !== : 表示不全等于,只有大小或类型不同
3.逻辑运算符:&& || !, 分别表示 与 或 非
4.连接运算符:
- . : 符号是一个小数点,表示将两个字符串连接在一起
- .= : 复合运算,将符号左右两边内容连接起来,然后再赋值给左边的变量
5.错误抑制符:@
- 在一些提前可预知的错误前加上 @ 符号,可以避免代码直接报错
6.三目运算符:表达式1 ? 表达式2 : 表达式3
- 表达式1 为条件表达式,2 和 3 为赋值表达式
- 如 $max = $a > $b ?$a : $b;
7.自操作运算符:++ --, 有前置和后置两种
- 类似的还有:+= -= *= /= %=
- 注意:使用自操作运算符时,符号右边要看成一个整体
- 如 $a -= $b - 1, 等价于 $a = $a - ($b - 1)
【举例】
<?php
$a = 1;
$b = 3;
echo $a + $b, '<hr/>';
var_dump(123 == '123');
var_dump(123 === '123');
echo '<hr/>';
$c = 'abc';
$d = 123;
echo $c . $d, '<br/>';
echo $c .= $d, '<hr/>';
echo @(123 / 0), '<hr/>';
$max = 3 > 0 ? 10 : 1;
echo $max, '<hr/>';
$e = 10;
echo $e++;
二、分支结构、循环结构
1、分支结构
1.1 if 分支
- 基本格式如下,需注意
elseif 是连在一起写的
<?php
$day = 'Monday';
if ($day == 'Sunday') {
echo 'Today is Sunday';
} elseif ($day == 'Saturday') {
echo 'Today is Saturday';
} else {
echo 'Monday';
}
1.2 switch 分支
switch(表达式) ,表达式需要是一个具体的值或者能够获得一个具体的值,基本使用如下:
<?php
$a = 2;
switch ($a) {
case 1:
echo 1;
break;
case 2:
echo 2;
break;
default:
echo 'error';
break;
}
2、循环结构
2.1 for 循环
for(表达式1;表达式2;表达式3) {}
<?php
for($i = 1;$i <= 10;$i++){
echo $i, ' ';
}
2.2 while, do-while 循环
<?php
$i = 0;
while ($i <= 10) {
echo $i++, ' ';
}
echo '<hr/>';
do {
echo $i--, ' ';
} while ($i > 0);
2.3 循环控制
- 通过
break 和 continue 进行循环控制,使用的方式与 C++ 一致,但在 PHP 中可以使用 break 2 和 continue 2 的方式进行多层次循环体的控制,即数字是多少就能控制多少层的循环体
三、文件包含、函数、错误类型简介
1、文件包含
- 文件包含的作用:实现代码的共享,相当于 C++ 中的导入头文件,Python 中导入包
- 文件包含的四种形式:使用的格式 include ‘文件名’;
include : 会多次包含文件,使用一次就会编译一次 include_once : 相同文件只会包含一次,当包含同一个文件多次的时候,文件也只会被编译一次 require : 与 include 作用相同 require_once : 与 include_once 作用相同
- include 和 require 的区别:
两者的使用方式和作用都相同,不同的是两者在导入文件出现错误时,报错的形式不一样
include 导入文件出错时,代码会出现警告,文件内代码能够继续运行require 导入文件出错时,代码会直接报错,文件内代码不会再继续运行- 当文件内代码必须有导入的文件才能实现时,应该使用
require , 如果导入的文件出错不会影后面的代码,可以使用include
2、函数
2.1 函数定义、参数
- 函数的定义使用 function 关键字定义,结构为:
function 函数名(参数){
}
- 说明:
a. 当函数需要进行传参时,如果定义的参数有默认值,则不能写在左边,只能放在右边 b. 在 PHP 中,函数对大小写不敏感,也就是小写定义的函数,大写字母也能调用 c. 在 PHP 中,不能出现同名函数,一个函数名只能对应一个函数,也就是没有函数重载
- 引用传递:
a. 能够通过函数直接改变外部变量的值,定义形参的时候,在形参前面加上 & 符号表示引用传递 b. 注意:引用传递必须传入变量,而不能直接传入数值,因为变量才有引用地址,直接传入数值代码会报错
- 函数返回值:
通过使用 return 关键字返回函数体计算的结果,返回值的数据类型可以是任意的
- 作用域:全局变量,局部变量,超全局变量
a. 全局变量只允许在全局空间中使用,不能在函数内部使用。同理,局部变量也只能在函数内部使用,不能在全局空间中使用
- 超全局变量,也就是系统定义的变量(如
$_server ),没有访问限制
b. 当想在函数内部使用全局变量或在全局空间中使用局部变量,此时可以使用 global 关键字定义变量,当 global 定义的变量在全局变量中存在的时候,系统会将变量内存地址指向全局空间中同名变量,如果不存在,系统就会开辟一块新的地址保存变量,本质就是实现内存地址的共用。
c. global 关键字的使用方法:
global 变量名; 此时不能赋值变量名 = 值; 修改变量值
d. golbal 定义局外变量(全局变量)的时候,如果在函数外部定义,则函数内部也不能直接使用变量
- 静态变量:
使用 static 关键字定义,static 变量名 = 变量值; 在函数内部定义静态变量只会检测一次,如 static $a = 1; , 当函数被调用的时候,这段代码只会执行一次
- 可变函数:
- 效果和可变变量类似,都是一个变量保存的值是另外一个函数的名字,此时可以通过这个变量充当函数使用
- 可变函数在系统使用过程中比较多,尤其是使用很多系统函数的时候,需要用户在外部定义一个自定义函数,然后通过变量的形式传入函数内部使用
【举例】
<?php
function hello()
{
echo 'Hello world!', '<br/>';
}
hello();
function sum(&$num1, $num2)
{
$num1 += $num2;
}
$a = 1;
$b = 2;
sum($a, $b);
echo $a, '<br/>';
function plus($num1, $num2)
{
return $num1 + $num2;
}
echo plus(2, 2), '<br/>';
$str = "Hello";
echo $str, ' ';
function get_var()
{
global $str;
$str = 'World';
}
get_var();
echo $str, '<br/>';
function sta()
{
static $index = 1;
echo $index++, ' ';
}
sta();
sta();
sta();
echo '<br/>';
function sys_func($user_func, $num)
{
return $user_func($num);
}
function user_func($num)
{
return $num * $num;
}
echo sys_func('user_func', 4);
2.2 常用的系统函数
- 关于输出的函数补充:
print() : 类似于 echo 输出内容,本质上是一种结构,不是函数,所以可以不用括号也能输出内容(能返回 1)print_r() : 类似于 var_dump(), 但是比 var_dump() 简单,不会输出数据的类型,只会输出值,一般数组打印使用较多
- 时间函数:
time() : 获取当前之间对应的时间戳 microtime() : 获取微秒级别的时间戳 date() : 按照指定格式输出对应的是时间戳,如果没有指定时间戳,则默认解释当前的时间戳 date('Y 年 m 月 d 日 H:i:s') : 能够输出当前时间的年月份和具体的时间,Y 表示年,m 表示月,d 表示日,H 表示24小时制的时,i 为分,s 为秒
date('Y 年 m 月 d 日 H:i:s', 1237823) : 能够按照规定的格式输出具体的时间戳属于哪一年, 数字部分单位是秒,是从1970年开始计时的
- 关于数学的函数:
max() /min() : 获取指定参数中的最大值或最小值,括号里面的参数可以是多个,如 max(12, 11, 13, 45); rand(min, max) : 获取指定闭区间范围内的一个随机数 mt_rand() : 作用和使用方法与 rand() 一样,但是效率比 rand() 高,推荐使用 round() : 四舍五入 ceil() /floor() : 向上取整 /向下取整 pow() : 求一个数的 n 次方 abs() : 求绝对值 sqrt() : 求一个数开根
- 有关函数的函数:
function_exists() : 判断一个函数是否存在,用来提高代码的安全性 func_get_arg() : 在自定义函数中,用来获取指定位置对应的参数,从0开始计数,第一个参数对应下标0 func_get_args() : 在自定义函数中获取所有的参数(数组) func_num_args() : 获取当前自定义函数的参数数量
【举例】
<?php
print 'Hello world<br/>';
echo print('');
echo '<br/>';
print_r('Hello world<hr/>');
echo date('Y 年 m 月 d 日 H:i:s'), '<br/>';
echo date('Y 年 m 月 d 日 H:i:s', 2), '<br/>';
echo time(), '   ', microtime();
echo '<hr/>';
echo max(12, 11, 13, 45), '  ', min(12, 11, 13, 45), '<br/>';
echo rand(1, 10), '  ', mt_rand(1, 10), '<br/>';
echo sqrt(2), '<hr/>';
function display($a, $b)
{
echo func_get_arg(0), '<br/>';
echo func_get_args(), '<br/>';
echo func_num_args();
}
display(1, 2, 3, 4);
3、错误类型简介
3.1 错误类型分类
1.语法错误(Parse error) :
- 用户书写的代码不符合 PHP 语法规范,代码在编译的过程中不通过,代码不会执行
2.运行错误(runtime error) :
- 代码编译通过,但在执行的过程中出现一些条件不满足导致的错误
3.逻辑错误 :
- 写代码的时候不够规范,出现一些逻辑性错误,导致代码正常执行,但不能得到想要的结果
3.2 错误提示
- 所有看到的错误代码在 PHP 中都被定义成系统常量,可以直接使用
1.系统错误:
E_PARSE : 编译错误,代码不会执行
E_ERROR : fatal error, 致命错误,会导致代码不能正常执行,在出错的位置断掉
E_WARNING : warning, 警告错误,不会影响代码执行,但可能得到预想不到的结果
E_NOTICE : notice, 通知错误,不会影响代码执行
2.用户错误: E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE
用户在使用自定义错误触发的时候,会使用到的错误代号,系统不会用到
3.其它错误: E_ALL
代表所有错误,通常在进行错误控制的时候使用比较多,一般在开发过程中使用
四、字符串、数组
1、字符串
1.1 字符串的定义
1、使用单引号或双引号定义,用引号适合定义一些比较短的或者没有结构要求的字符串
2、使用 nowdoc /heredoc 定义字符串:适合定义长的,有结构要求的字符串
- nowdoc : 定义没有单引号的单引号字符串
- heredoc : 定义没有双引号的双引号字符串
3、结构化定义字符串的规则:
a. 上边界符后面不能有任何内容,包括空格
b. 下边界符必须顶格写,且后面只能跟分号,不能有别的内容
c. 上下边界符名字需要相同,且下边界符不能有引号
d. 结构化定义字符串内部(即边界符之间的内容)的所有内容都是字符串本身
// nowdoc
$str1 = <<<'边界符'
// 字符串内容
'边界符';
// heredoc
$str2 = <<<边界符
// 字符串内容
边界符;
【举例】
<?php
$str1 = <<<'info'
My name is kele,
how are you?
info;
$str2 = <<<info
My name is kele,
how are you?
info;
var_dump($str1);
echo '<br/>';
var_dump($str2);
1.2 字符串转义和长度统计
1、常用的转义字符:
\' : 在单引号字符串中显示单引号
\" : 在双引号字符串中显示双引号
\r : 代表回车,回到当前行的首位置
\n : 换行,在浏览器中不会识别 \n, 要看到换行的效果需要查看网页源码
\t : 相当于 tab 键
\$ : 可以用来输出变量
2、 单引号定义的字符串内容中只能够识别 \'
双引号定义的字符串内容中不能识别 \', 但其它转义字符都能识别
双引号内容能识别 $ 符号,所以在双引号定义的字符串中能够解析变量内容,但单引号不能
3、 双引号中变量识别规则:
变量本身和变量后面的内容要能够区分,保证变量的独立性,否则代码会报错,可以使用空格分开,如 $a = "ab $a cd";
可以使用变量专业标识符区分,即给变量加上一组大括号,如 $a = "ab {$a} cd";
1、使用基本函数 strlen(), 能够得到字符串的长度,以字节为单位
2、多字节字符串长度:
包含中文长度,需要应用到 mbstring 扩展(mb: Multi Bytes)
a. 加载 mbstring 扩展:
- 找到 php.ini 配置文件,然后搜索 mbstring
- 找到 extension=php_mbstring.dll 配置文件
- 将文件名前面的分号删除然后保存文件
- 补充:没有分号表示此扩展文件是打开的,分号表示关闭
b. 加载扩展文件后需要重新启动 Apache, 然后就能使用 mb 扩展带来的函数
c. 使用 mb_strlen(字符串, 字符集) 函数统计字符串长度,还能给定字符集类型进行统计,如 mb_string($a, 'gbk')
2、数组
2.1 数组的定义和遍历
1、 使用 array 关键字定义:变量 = array(元素1, 元素2...);
如 $a = array(1, 2, 3);
2、 使用中括号包裹数据:变量 = [元素1, 元素2...];
如 $a = [1, 2, 3, 4];
3、 隐形定义数组:给变量添加一个中括号,系统将变量自动转化为数组
如 $a[] = 1; $a[2] = 2; 下标可以不添加,系统默认从0开始,也可以手动添加,下标可以是数字和字符串等
4、 PHP 数组的特点:
a. 下标可以是整数下标和字符串下标。整数下标用来索引数组,字符串下标用来关联数组
b. 不同类型的下标可以混合使用(混合数组)
c. 数组元素的顺序以放入顺序为准,和下标无关
d. 数字下标的自增长特性:从0开始增长,但如果手动添加更大的下标,则后面的下标从最大值 +1 开始计算
如:$a = array(1, 2); $a[10] = 10;
==> 前两个对应的下标为 0, 1, 第三个开始的下标从 10 开始计数
e. 特殊值下标自动转换: true 转为 1, false 转为 0, NULL 转为 "" (空字符)
f. php 中数组没有长度和数据类型的限制,存储的内存在堆区
<?php
$info = array(
array('name' => 'Mary', 'age' => 18),
array('name' => 'Jack', 'age' => 20)
);
1、 基本格式为:
foreach(数组变量 as 下标 => 值){
// 通过下标访问元素的值即可
}
2、 使用 foreach 遍历的过程中,下标和值都是自己定义的变量,其中下标变量可以不用定义,可以直接定义变量值进行访问即可
foreach(数组变量 as 值){
// 直接输出值的内容
}
3、 两种访问方式根据需要进行选择即可,一般多维数组使用第一种方式获得每组值对应的下标,然后通过下标继续访问即可
【举例】
<?php
$a = array(1, 2, 3, 'hello');
$b = [1, 2, 3, 4];
$c[] = 'hello';
$c[10] = 'Mary';
$c[] = 12;
echo '<pre/>';
print_r($a);
print_r($b);
print_r($c);
echo '<hr/>';
$info = array(
array('name' => 'Mary', 'age' => 18),
array('name' => 'Jack', 'age' => 20),
array('name' => 'Lucy', 'age' => 19)
);
print_r($info);
echo '<hr/>';
foreach ($info as $value) {
foreach ($value as $k => $v) {
echo $k, ' : ', $v, '   ';
}
echo '<br/>';
}
echo '<br/>';
foreach ($info as $value) {
echo 'name : ', $value['name'], '   ', 'age : ', $value['age'], '<br/>';
}
echo '<br/>';
2.2 数组相关函数
1、 排序函数:按照 ASCII 码进行比较排序
sort() : 顺序排序,原来的下标不会改变,只针对值进行排序
rsort() : 逆序排序
asort() : 顺序排序,针对值进行排序,但每个值对应的下标也会随着一起改变
arsort() : 逆序排序
ksort() : 顺序排序,针对下标的大小进行排序,每个下标对应的值也会一同改变
krsort() : 逆序排序
shuffle() : 随机打乱数组元素
2、 指针函数:也就是针对下标进行的操作
reset() : 重置指针,将数组指针回到首位
end() : 重置指针,将数组指针指到最后一元素
next() : 指针下移,取得下一个指针元素的值
prev() : 指针上移,取得上一个元素的值
current() : 获取当前指针对应的元素值
key() : 获取当前指针对应得到下标值
【注意】next() /prev() 会移动指针,可能导致指针移动到最前或最后(此时离开数组),导致数组不能使用
通过 next /prev 不能回到正确的指针位置,只能通过 reset() /end() 进行指针重置
【举例】
<?php
echo '<pre/>';
$a = [6, 8, 14, 3, 2, 39, 87, 23];
print_r($a);
sort($a);
print_r($a);
asort($a);
print_r($a);
$b = array(1 => 1, 5 => 4, 2 => 2, 3 => 12);
print_r($b);
ksort($b);
print_r($b);
$c = [17, 4, 20, 9, 18, 3];
echo 'value', ' ', 'key', '<br/>';
echo current($c), ' ', key($c), '<br/>';
echo next($c), ' ', key($c), '<br/>';
echo end($c), ' ', key($c), '<br/>';
echo prev($c), ' ', key($c), '<br/>';
echo reset($c), ' ', key($c), '<br/>';
2.3 简单的算法排序
<?php
function bubble_sort(&$array)
{
for ($i = 0, $len = count($array) - 1; $i < $len; $i++) {
for ($j = 0; $j < $len - $i; $j++) {
if ($array[$j] > $array[$j + 1]) {
$t = $array[$j];
$array[$j] = $array[$j + 1];
$array[$j + 1] = $t;
}
}
}
}
function select_sort(&$array)
{
for ($i = 0, $len = count($array); $i < $len; $i++) {
$min = $i;
for ($j = $i + 1; $j < $len; $j++) {
if ($array[$min] > $array[$j]) {
$min = $j;
}
}
if ($min != $i) {
$t = $array[$i];
$array[$i] = $array[$min];
$array[$min] = $t;
}
}
}
function insert_sort(&$array)
{
$len = count($array) - 1;
for ($i = 1; $i < $len; $i++) {
$t = $array[$i];
$flag = false;
for ($j = $i - 1; $j >= 0; $j--) {
if ($array[$j] > $t) {
$array[$j + 1] = $array[$j];
$flag = true;
} else {
break;
}
}
if ($flag) {
$array[$j + 1] = $t;
}
}
}
function quick_sort($array)
{
$len = count($array);
if ($len <= 1)
return $array;
$min = $max = array();
for ($i = 1; $i < $len; $i++) {
if ($array[$i] < $array[0]) {
$min[] = $array[$i];
} else {
$max[] = $array[$i];
}
}
$min = quick_sort($min);
$max = quick_sort($max);
return array_merge($min, (array)$array[0], $max);
}
$a = [4, 7, 2, 9, 1, 0, 3, 23, 11];
echo '<pre/>';
print_r($a);
echo '<hr/>';
|