My Little World

learn and share


  • 首页

  • 分类

  • 标签

  • 归档

  • 关于
My Little World

文件上传

发表于 2017-05-02

修改php.ini文件配置

php.ini文件在不同的集成环境包中都在安装目录的php文件下,如果有多个版本php,则在每个版本里面都会有一个php.ini文件
配置项 功能说明
file_uploads on为 开启文件上传功能,off为关闭
post_max_size 系统允许的POST传参的最大值
upload_max_filesize 系统允许的上传文件的最大值
memory_limit 内存使用限制
【建议尺寸: file_size(文件大小) < upload_max_filesize < post_max_size < memory_limit】
max_execution_time 设定脚本的最大执行时间。
也可以根据需求做适当的改变。通常不需要来修改,系统默认值即可。超大文件上传的时候,可能会涉及到这一项参数的修改
上传时间太长了,会超时。如果你将此项参数设为0,则是不限制超时时间,不建议使。

html页面

1.form 表单中的参数method 必须为post。若为get是无法进行文件上传的
2.enctype须为multipart/form-data
代码链接

文件上传

按照数组和步骤完成文件上传
所有文件的信息存储在$_FILES[‘file’]中
代码链接

多文件上传

写了2个或者多个input
将每个input name设置为”file[]”
对每个input上传文件后 $_FILE[‘file’]的每个属性将变成数组,依次对应每个input上传的文件

上传进度处理

首先要修改php.ini的相关配置
配置项 说明
session.upload_progress.enabled 是否启用上传进度报告(默认开启) 1为开启,0为关闭
session.upload_progress.cleanup 是否在上传完成后及时删除进度数据(默认开启, 推荐开启)

session.upload_progress.prefix[=upload_progress_]
进度数据将存储在_SESSION[session.upload_progress.prefix . _POST[session.upload_progress.name]]

session.upload_progress.name[=PHP_SESSION_UPLOAD_PROGRESS]
如果_POST[session.upload_progress.name]没有被设置, 则不会报告进度.

session.upload_progress.freq[=1%] 更新进度的频率(已经处理的字节数), 也支持百分比表示’%’.
session.upload_progress.min_freq[=1.0] 更新进度的时间间隔(秒)

文件上传的进度信息存储在$_SESSION中
代码链接

My Little World

文件

发表于 2017-05-01

读

readfile 传入一个文件路径,输出一个文件
int readfile ( string $文件名)

file_get_contents 传入一个文件或文件路径,打开这个文件返回文件的内容。文件的内容是一个字符串。
string file_get_contents ( string filename)

资源类型处理方式
fopen函数,打开资源,参数为文件打开路径,打开文件模式,返回资源类型
resource fopen ( string $文件名, string 模式)

fread函数 读取打开的文件资源。读取指定长度的文件资源,读取一部份向后移动一部份。至到文件结尾。
string fread ( resource $操作资源, int 读取长度)

fclose函数的功能是关闭资源。资源有打开就有关闭
bool fclose ( resource $操作资源 )

fopen的模式
模式 说明
r 只读方式打开,将文件指针指向文件头。
r+ 读写方式打开,将文件指针指向文件头。
w 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建
w+ 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建
a 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建
a+ 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之
x 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建
x+
创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建
t windows下将\n转为\r\n
b 二进制打开模式

创建和修改

file_put_contents 向指定的文件当中写入一个字符串,如果文件不存在则创建文件。返回的是写入的字节长度
int file_put_contents ( string $文件路径, string $写入数据])

fwrite 配合fopen进行写入操作,写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建
int fwrite ( resource $文件资源变量, string $写入的字符串 [, int 长度])
1.不论有没有新建都会打开文件重新写入
2.原有的文件内容会被覆盖掉
3.文件不存在会创建
模式
x 每次写入会干掉原有文件的内容,文件不存在都会创建
a 每次写入都会向文件的尾端追加内容

tmpfile 创建一个临时文件,返回资源类型。关闭文件即被删除
resource tmpfile ( )

rename 重命名文件 返回一个bool值,将旧的名字改为新的名字
bool rename($旧名,$新名);

copy 复制文件 将指定路径的源文件,复制一份到目标文件的位置。
bool copy(源文件,目标文件)

unlink 删除文件 这个删除是直接删除。使用的是windows电脑,在回收站看不到这个文件
bool unlink(指定路径的文件)

检测文件属性函数

bool file_exists ( $指定文件名或者文件路径) 功能:文件是否存在。
bool is_readable ( $指定文件名或者文件路径) 功能:文件是否可读
bool is_writeable ( $指定文件名或者文件路径) 功能:文件是否可写
bool is_executable ( $指定文件名或者文件路径) 功能:文件是否可执行
bool is_file ( $指定文件名或者文件路径) 功能:是否是文件
bool is_dir ( $指定文件名或者文件路径) 功能:是否是目录
void clearstatcache ( void ) 功能:清楚文件的状态缓存

常用函数

rewind ( resource handle) 指针回到开始处
fseek ( resource handle, int offset [, int from_where]) 文件指针向后移动指定字符
filesize 检测文件的大小
file(文件名) 把整个文件读入一个数组中
fgets(文件名) 从文件指针中读取一行,读到最后返回false
fgetc(文件名) 从文件指针中读取一个字符,读到最后返回false
ftruncate(文件名,长度) 将文件截断到给定的长度
filectime(文件名) 文件创建时间
filemtime(文件名) 文件修改时间
fileatime(文件名) 文件上次访问时间

文件锁定

bool flock ( resource $handle , int $operation) 轻便的咨询文件锁定
锁类型 说明
LOCK_SH 取得共享锁定(读取的程序)
LOCK_EX 取得独占锁定(写入的程序
LOCK_UN 释放锁定(无论共享或独占)
例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

$fp = fopen("demo.txt", "r+");

// 进行排它型锁定
if (flock($fp, LOCK_EX)) {

fwrite($fp, "文件这个时候被我独占了哟\n");

// 释放锁定
flock($fp, LOCK_UN);
} else {
echo "锁失败,可能有人在操作,这个时候不能将文件上锁";
}

fclose($fp);

?>

处理文件夹

处理文件夹的基本思想如下:
1.读取某个路径的时候判断是否是文件夹
2.是文件夹的话,打开指定文件夹,返回文件目录的资源变量
3.使用readdir读取一次目录中的文件,目录指针向后偏移一次
4.使用readdir读取到最后,没有可读的文件返回false
5.关闭文件目录

opendir 打开文件夹,返回操作资源
readdir 读取文件夹资源
is_dir 判断是否是文件夹
closedir 关闭文件夹操作资源
filetype 显示是文件夹还是文件,文件显示file,文件夹显示dir
例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
//设置打开的目录是D盘
$dir = "d:/";

//判断是否是文件夹,是文件夹
if (is_dir($dir)) {
if ($dh = opendir($dir)) {

//读取一次向后移动一次文件夹指针
echo readdir($dh).'<br />';
echo readdir($dh).'<br />';
echo readdir($dh).'<br />';
echo readdir($dh).'<br />';

//读取到最后返回false

//关闭文件夹资源
closedir($dh);
}
}
?>

文件权限设置

函数用法与linux的权限操作的用法一样。
函数 功能说明
chmod 修改读取模式
chgrp 修改用户组
chown 修改权限

文件路径函数

array pathinfo ( string $路径)
功能:传入文件路径返回文件的各个组成部份

1
2
3
4
5
6
7
8
<?php
$path_parts = pathinfo('d:/www/index.inc.php');

echo '文件目录名:'.$path_parts['dirname']."<br />";//d:/www
echo '文件全名:'.$path_parts['basename']."<br />";//index.inc.php
echo '文件扩展名:'.$path_parts['extension']."<br />";//php
echo '不包含扩展的文件名:'.$path_parts['filename']."<br />"; //index.inc
?>

string basename ( string $路径[, string $suffix ])
功能:传入路径返回文件名
第一个参数传入路径。
第二个参数,指定我文件名到了指定字符停止。

dirname(string $路径)
功能:返回文件路径的文件目录部份

mixed parse_url ( string $路径 )
功能:将网址拆解成各个部份

string http_build_query ( mixed $需要处理的数据)
功能:生成url 中的query字符串

1
2
3
4
5
6
7
8
//定义一个关联数组
$data = [
'username'=>'php',
'area'=>'hubei'
];

//生成query内容
echo http_build_query($data);//username=php&area=hubei

http_build_url()
功能: 生成一个url

My Little World

正则表达式

发表于 2017-04-30

正则表达示主要用在以下一些地方:
1.匹配邮箱、手机号码、验证码
2.替换敏感的关键词。例如:涉及政治和骂人的话
3.文章采集。
4.早期的表情替换技术,ubb文件编码、markdown编辑器替换等
5.以后自己写模板引擎也需要用到正则表达示

正则表达式常见项目场景
开发工具中批量替换
客户端,服务端数据校验
客户端HTML检索(Sizzle)
服务端文本提取
数据爬虫的实现

定界符

定界符,就是定一个边界,边界已内的就是正则表达示
定界符,不能用a-zA-Z0-9\ 其他的都可以用。必须成对出现,有开始就有结束。
/中间写正则/ 正确
$中间写正则$ 正确
%中间写正则% 正确
^中间写正则^ 正确
@中间写正则@ 正确
(中间写正则) 错误
A中间写正则A 错误

匹配函数和原子

preg_matc 函数:根据$正则变量,匹配$字符串变量。如果存在则返回匹配的个数,把匹配到的结果放到$结果变量里。如果没有匹配到结果返回0。
int preg_match ( string $正则 , string $字符串 [, array &$结果] )

原子:需要匹配的内容,我们见到的空格、回车、换行、0-9、A-Za-z、中文、标点符号、特殊符号全为原子
特殊标志的原子:
原子 说明
\d 匹配一个0-9
\D 除了0-9以外的所有字符
\w a-zA-Z0-9_
\W 除了0-9A-Za-z_以外的所有字符
\s 匹配所有空白字符\n \t \r 空格
\S 匹配所有非空白字符
[ ] 指定范围的原子

[^ 字符] 不匹配指定区间的字符^ 抑扬符在中括号里面的作用是不准以中括号里面的字符进行匹配。

使用原子的时候,只能够匹配一个字符

元字符

元字符来修饰原子,实现更多次匹配
元字符 功能说明
*是代表匹配前面的一个原子,匹配0次或者任意多次前面的字符。
+匹配最少1次前面的字符
? 前面的一个字符可有可无【可选】 有或没有
. 更标准一些应该把点算作原子。匹配除了\n以外的所有字符
| 或者。注:它的优先级最低了。
^ 必须要以抑扬符之后的字符串开始
$ 必须要以$之前的字符结尾
{m} 有且只能出现m次
{n,m} 可以出现n到m次
{m,} 至少m次,最大次数不限制
() 改变优先级或者将某个字符串视为一个整体,匹配到的数据取出来也可以使用它

1.正则表达示是有边界的,这个边界是定界符的开始和结尾是正则的边界。
2.this是一个英文单词,后面加上一个空格,意味着这个词结束了,到达了这个词的边界
\b词边界,就是指匹配的字符必须要在最前或者最后。
\B非边界,就是匹配的字符不能在一个正则表达示的最前或者最后

模式匹配

模式匹配符的用法如下:
/ 正则表达式/模式匹配符

模式匹配符 功能
i 模式中的字符将同时匹配大小写字母.

m 当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。
如果要匹配的字符串中没有“\n”字符或者模式中没有 ^ 或 $,则设定此修正符没有任何效果

s 将字符串视为单行,换行符\n作为普通字符.
如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。

x 将模式中的空白忽略.
1.如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略。
2.未转义的字符类外部的#字符和下一个换行符之间的字符也被忽略。

A 强制仅从目标字符串的开头开始匹配.
D 模式中的美元元字符仅匹配目标字符串的结尾.
U 匹配最近的字符串.

e 将匹配项找出来,进行替换
e模式也叫逆向引用。主要的功能是将正则表达式括号里的内容取出来,放到替换项里面替换原字符串。
使用这个模式匹配符前必须要使用到preg_replace()。
preg_replace的功能:使用$正则匹配项,找到$查找字符串变量。然后用$替换项变量进行替换
mixed preg_replace ( mixed $正则匹配项 , mixed $替换项 , mixed $查找字符串)

常用正则函数

函数名 功能
preg_filter 执行一个正则表达式搜索和替换
preg_grep 返回匹配模式的数组条目
preg_match 执行一个正则表达式匹配
preg_match_all 执行一个全局正则表达式匹配
preg_replace_callback_array 传入数组,执行一个正则表达式搜索和替换使用回调
preg_replace_callback 执行一个正则表达式搜索并且使用一个回调进行替换
preg_replace 执行一个正则表达式的搜索和替换
preg_split 通过一个正则表达式分隔字符串

My Little World

数组

发表于 2017-04-30

数组可以存入多个不同类型的数据,是一个复合数据类型

索引数组

下标全为整型的数组
1.索引数组若不强制声明他的下标,他的下标是从0开始的。
2.如果指定过下标他的下标就为我指定的值。下标重复,后面的值会将前面的值覆盖,下标可以不按顺序指定
3.若某个值,强制指定了下标(下标为10)。在它后面加上的值,不指定下标的话。他们的下标增长规律为最大值+1。

增

1.向索引数组中增加元素用: 数组变量名[]、数组变量名[键值]这两种方式来增加元素,每次增加的值都在数组最后一个位置
2.键值的增长规则与之前的规则一样。都是最大值加1的原则。

删

1.使用unset删除变量的方式来删除数组里面的值。
2.删除了中间的值,并不会让后面的下标向前自动移动。而是原来的值为多少就为多少
3.删除掉其中的某个值,新加入的值不会替换掉原来的位置,下标依然遵循最大值加1的原则。

改

用变量名[键] = 新值。就把数组中的值定的值修改了

声明

1.用变量名后面接中括号的方式声明数组。数组名[] = ‘xxx’;
2.数组名 = [‘aaaa’,’bbbb’,’ccccc’]
3.数组名 = array(‘aa’,’bb’,’cc’)

关联数组

下标可以为字符串的数组
1.声明关联数组是 键名 => 值
2.在关联数组可以有索引数组的元素
3.关联数组中的索引数组的元素后再声明了无下标的元素,依然是最大值+1原则
增删改声明同索引数组

多维数组

数组里面元素为数组,有几层称为几维数组,元素的访问只要一层一层下标挨着写下去即可
例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$area = array(
'china' => array(
'上海',
'湖北',
'天津',
'北京' => array(
'hd' => '海淀',
'朝阳',
'房山',
'cp' => '昌平',
),//注意逗号
'广东' => array(
'深圳',
'广州',
'佛山',
'dg' => '东莞',

)
)
)
访问 昌平,即$area[china]['北京']['cp']
`

数组处理

统计数组长度 count

int count ( mixed $变量)
$a[0] = 1;
$a[1] = 3;
$a[2] = 5;
$result = count($a);//3
如果是一个多维数组,这个函数只会统计当前的这一个维度的数组元素个数

遍历

1.下标连续的索引数组
for($i = 0 ; $i < count($num) ; $i++){
echo $num[$i].’
‘;
}
2.下标不连续索引数组、关联数组
foreach( 要循环的数组变量 as [键变量 =>] 值变量){
//循环的结构体
}
键变量可写可不写,不写每次只读取键值对的值到值变量
例

1
2
3
4
5
6
7
8
9
10
$data = [
'nh' => '你好',
'xx' => '谢谢',
];
foreach($data as $key => $value){
echo $key . '-------' . $value . '<br />';
}
foreach($data as $value){
echo $value . '<br />';
}

3.多维数组
多层循环套嵌即可

  1. list each函数
    list:从左到右,将索引数组下标为0的元素对应变量1,下标1的元素对应变量2,依此类推。
    list ( mixed $变量1 [, mixed $变量n ] )
    list($one , $two , $three) = array(‘张三’ ,’李四’ ,’王五’);
    如果list变量找到对应下标值,变量就没有对应值,
    数组长度大于list变量数,多余的数组元素会被直接舍弃,没有变量对应

each:传入一个数组。它会将其中的一个元素拆为一个新数组,元素的下标做新数组下标为0和下标为’key’的值,元素的值做新数组下标为1和下标为’value’的元素的值。每次执行这样操作一个元素。执行一次先后移动一次,同样的方式操作下一个数组元素。执行到最后,返回false。
array each ( array &$array )

1
2
3
4
5
6
7
8
9
10
//定义一个变量叫$temp
$temp=[
'11'=>'dddddd',
'111'=>'gggggg',
];

//第一次each
$data = each($temp);//对'11'=>'dddddd',拆分,返回数组给$data
$data = each($temp);//对'111'=>'gggggg',拆分,返回数组给$data
$data = each($temp);//此时,后面已没有可操作的元素了,返回false

结合list和each访问数组元素
while(list($key,$value) = each($temp)){
echo $key. ‘—–’ .$value .’
‘;
}
$key回去寻找下标0的元素值,$value回去寻找下标1的元素值

常用操作函数

函数名(数组名)
函数 功能
array_shift 弹出数组中的第一个元素,后面元素往前移动,返回一个元素值
array_unshift 向指数组的开始处压入一个或多个元素,返回的是总个数
array_push 向指数组末尾处压入一个或多个元素,返回的是总个数
array_pop 弹出数组末尾的最后一个元素
current 读出指针当前位置的值
key 读出指针当前位置的键
next 指针向下移
prev 向上移
reset 指针到开始处
end 指针到结束处

常用函数

函数名 功能
array_combine() 生成一个数组,用一个数组的值作为键名,另一个数组值作为值
range() 创建并返回一个包含指定范围的元素的数组。
compact() 创建一个由参数所带变量组成的数组
array_fill() 用给定的值生成数组
array_chunk() 把一个数组分割为新的数组块
array_merge() 把两个或多个数组合并为一个数组
array_slice() 在数组中根据条件取出一段值,并返回
array_diff() 返回两个数组的差集数组
array_search() 在数组中搜索给定的值,如果成功则返回相应的键名
array_splice() 把数组中的一部分去掉并用其它值取代
array_sum() 计算数组中所有值的和
in_array() 检查数组中是否存在某个值
array_key_exists() 检查给定的键名或索引是否存在于数组中
shuffle() 将数组打乱,保留键值
count() 计算数组中的单元数目或对象中的属性个数
array_flip() 返回一个键值反转后的数组
array_keys() 返回数组所有的键,组成一个数组
array_values() 返回数组中所有值,组成一个数组
array_reverse() 返回一个元素顺序相反的数组
array_count_values() 统计数组中所有的值出现的次数
array_rand() 从数组中随机抽取一个或多个元素,注意是键名
array_unique() 删除重复值,返回剩余数组
sort() 按升序对给定数组的值排序,不保留键名
rsort() 对数组逆向排序,不保留键名
asort() 对数组排序,保持索引关系
arsort() 对数组逆向排序,保持索引关系
ksort() 按键名对数组排序
krsort() 将数组按照键逆向排序
natsort() 用自然顺序算法对数组中的元素排序
natcasesort() 自然排序,不区分大小写
array_filter() 去掉数组中的空元素或者预定元素
extract 将键变为变量名,将值变为变量值

My Little World

基础知识

发表于 2017-04-30

变量/数据类型

1.必须要以$开始。如变量x必须要写成$x
2.变量的首字母不能以数字开始
3.变量的名字区分大小写
4.变量不要用特殊符号、中文,_不算特殊符号
5.变量命名要有意义(别写xxx,aaa,ccc这种 变量名)

echo 显示命令
/*
多行注释 这里是注释区域代码
*/
// 表示单行注释

1.整型
8进制声明: 以0开始,后面跟0-7的整数 $bajingzhi = 033145;
16进制声明: 以0x开始,后面跟0-f的,0x的abcdef不区分大小写。$shiliu = 0x6ff;
2.布尔类型
true/false
布尔值=false .
整数值=0
浮点数=0.0
空字符串
空数组
3.字符串
用单引号声明 $zhifu = ‘曾经有操蛋的爱情摆在我面前’;
用双引号声明 $str = “如果非要在滚犊子前面加上一个时间的话我愿意是马上。”;
字界符声明
1).在变量后面的等号写三个小于号(<<<)。
2).然后在<<<后面写上字符(建议英文大写字符)。如下例中的:ABC
3).然后换行写上任意想写的字符
4).写完后,顶行。在行最开始处,再写上<<<后面的字符和分号。如下例中的:ABC;

1
2
3
4
5
6
7
8
9
$dingjie = <<<ABC
因为在
一千年以后
世界
早<br />
已
<i>没了我</i>
别等到一千年以后<h1>世界早已忘了我</h1>
ABC;

换行在显示时显示空格,<br/>表示显示换行

1.双引号解析变量,但是单引号不解析变量。

2.在双引号里面插入变量,变量后面如果有英文或中文字符,它会把这个字符和变量拼接起来,视为一整个变量。要在变量后面接上特殊字符,要用空格等分开。

3.如果在双引号里面插变量的时候,后面不想有空格,可以拿大括号将变量包起来。

4.双引号解析转义字符,单引号不解析转义字符。但,单引号能解析\’ 和\

5.单引号效率高于双引号,尽可能使用单引号

6.双号和单引号可以互插!!!双引号当中插入单引号,单引号当中插入变量,这个变量会被解析。
$legend = ‘猛虎’;
$NoAlike = “心有’$legend’,细嗅蔷薇”;
echo $NoAlike;//心有’猛虎’,细嗅蔷薇

7.神奇的字符串拼接胶水——(.)点,用来拼接字符串。

1
2
3
4
5
6
<?php
$php = 'PHP中文网';
//中间加了空格
$str = $php . 'aaaa';
echo $str;//PHP中文网aaaa
?>

8.定界符声明字符串可以解析变量,加入单双引号同样会以单双引号形式显示出来,引号中间是变量的话,同样会被解析出来。
4.浮点型
小数
var_dump() 是一个函数。向括号()中间插入变量。这个函数,会打印出来数据类型,还会对应显示变量的长度和值。
例
$f1 = 1;
var_dump($f1);//int(1)
$f1 = 1.2;
var_dump($f1);//float(1.2)
两个浮点型数据不能作比较,因为实际比较值不确定
5.null
主要有以下三空情况会产生空(null)类型:

1.通过变量赋值明确指定为变量的值为NULL

2.一个变量没有给任何值

3.使用函数unset()将变量销毁掉
empty()可以向括号中间传入一个变量。这个变量的值如果为false或者为null的话,返回true。
isset()可以向括号中间传入一个或者多个变量,变量与变量间用逗号分开。只要有有一个变量为null,则返回false。否则,则返回true。

1
2
3
$jia = false;
$result = isset($jia);
var_dump($result);//bool(true)

unset()这个函数的功能是毁掉变量。unset(变量)括号中间插入想要毁掉的变量名,这个变量就会被毁掉。

1
2
3
$iphone = '手机';
unset($iphone);
var_dump($iphone);//null

6.数组
一个或者多个值
一个或者多个值用逗号分开
$shu = array(1,2,3);
7.资源类型
资源就提操作我们可见和不可见的文件、网络和数据

数据类型转换

gettype(传入一个变量) 返回变量的类型。$type = gettype($float);
数据类型判断
is_int 是否为整型
is_bool 是否为布尔
is_float 是否是浮点
is_string 是否是字符串
is_array 是否是数组
is_object 是否是对象
is_null 是否为空
is_resource 是否为资源
is_scalar 是否为标量
is_numeric 是否为数值类型
is_callable 是否为函数

布尔值判断时的自动类型转换:
1,整型的0为假,其他整型值全为真
2, 浮点的0.0,布尔值的假。小数点后只要有一个非零的数值即为真。
3,空字符串为假,只要里面有一个空格都算真。
4,字符串的0,也将其看作是假。其他的都为真
5,空数组也将其视为假,只要里面有一个值,就为真。
6,空也为假
7, 未声明成功的资源也为假

运算自动类型转换:
布尔型:整型、浮点型
字符串:整型、浮点型

强制类型转换有三种方式:
1.用后面的三个函数可以完成类型转换,intval()、floatval()、strval()
2.变量前加上()里面写上类型,将它转换后赋值给其他变量
3.settype(变量,类型) 直接改变量本身
转换结果:
1.空转为整型会为整型的0
2.空转为浮点会为浮点的0
3.空转为字符串会为空字符串‘’
4.浮点的123.0转为字符串会为字符串123
5.浮点的123.2转为字符串会为字符串的123.2
6.浮点即使小数点再大,它都会被干掉,会舍掉小数点后面的值
7.如果字符串转为整型的时候,如果数值在前面,会将前面的数值拿出来做为整型的转换值。
8.settype(变量,’null’); 等价于 unset()一个变量
9.$目标变量 = (类型)$操作变量 只会改变目标变量的类型,不会改变原变量的类型,Settype是改变原值

常量

define(常量名,常量值) 定义常量
注:
1.常量值只能为上一章中我们讲到的标量。
2.常量名可以小写,但是通常大写
3.常量名可以不加引号,但是通常加上引号。
4.在字符串中调用常量的时候,必须在引号外面
5.常量名建议只用字母和下划线

内置常量

LINE 当前所在的行
FILE 当前文件在服务器的路径
FUNCTIOIN 当前函数名
CLASS 当前类名
METHOD 当前成员方法名
PHP_OS PHP运行的操作系统
PHP_VERSION 当前PHP的版本
TRAIT Trait 的名字,php5.4新加
DIR 文件所在的目录
NAMESPACE 当前命名空间的名称(区分大小写)

可变变量

已声明的变量前,再加上变量符

1
2
3
4
5
6
//定义了一个变量叫作 $shu 将$shu这个变量的值设为字符串的biao
$shu = 'biao';
//定义了一个【变量】$biao。将他的值设置为鼠标
$biao = '鼠标';
//$$shu 就是可变变量:在已声明的变量$shu前又加上了一个变量符
echo $$shu;//'鼠标'

即$shu 是biao,$biao是’鼠标’
还可以加多个$即一层层替换过去就行

外部变量

$_GET 将得到get方法传值的数据 参数会显示在URL(网址栏)上。 $u = $_GET[‘username’];
$_POST 将得到post方法传值的数据 通过浏览器的请求头文件传递的数据,不会显示在url上。 $u = $_POST[‘username’];
$_REQUEST即可以接收get传值也可以接收post传值。 $u = $_REQUEST[‘username’];
$_COOKIE 得到会话控制中cookie传值
$_SESSION 得到会话控制中session的值
$_FILES 得到文件上传的结果
以上这些变量全是超全局的。在任何环境都能用

环境变量

$_SERVER
$_SERVER[“REQUEST_METHOD”] 请求当前PHP页面的方法
$_SERVER[“REQUEST_URI”] 请求的URI
$_SERVER[“SERVER_SOFTWARE”] 用的是哪一种服务器
$_SERVER[“REMOTE_ADDR”] 客户的IP地址
$_SERVER[“SERVER_ADDR”] 当前服务器的IP地址
$_SERVER[“SCRIPT_FILENAME”] 主前请求文件的路径
$_SERVER[“HTTP_USER_AGENT”] 当前访问这个网址的电脑和浏览器的情况
$_SERVER[“HTTP_REFERER”] 上级来源(用户从哪个地址进入当前网页的)
$_SERVER[“REQUEST_TIME”] 当前的时间
URI 和URL都是网址,但是URL带有了主机地址部份,而URI不带主机地址部份,例如:
http://www.php.cn/abc.php?username=php 是一个URL(统一资源定位符),
而URI是不带主机和(http://)协议的部份:abc.php?username=php

变量引用

情况1:
$fo = 5;
//$fo的值为5,将5赋值
$bar = $fo;
//$bar的值原来为5,现在将值改为6
$bar = 6;
//$bar的结果为6
echo $bar.’
‘;
//$fo的结果为5
echo $fo.’
‘;
情况2:
$fo = 5;
//注意,加上了一个&符哟
$bar = &$fo;
$bar = 6;
//$bar的结果为6
echo $bar.’
‘;
//$fo的结果为6
echo $fo.’
‘;

算数运算

+ 加号 $x + $y
- 减号 $x - $y
* 乘号,乘以 $x * $y
/ 除号,除以 $x / $y
% 取余也叫取模、求模 $x % $y
优先级:先乘除,后加减
改变优先级,那就用(),将想要优先的值给括起来

赋值运算

符号 举例 等价式
+= $x += $y $x = $x + $y
-= $x -= $y $x = $x - $y
*= $x *= $y $x = $x * $y
/= $x /= $y $x = $x / $y
%= $x %= $y $x = $x % $y
.= $x .= $y $x = $x . $y

例.
$x = 5;
$y = 8;
$x .= $y;
echo $x; //58

自加自减

$x++ 先赋值后加
$x– 先赋值后减
++$x 先加后赋值
–$x 先减后赋值

比较运算符

大于 >
小于 <
大于等于 >=
小于等于 <=
不等于 !=
等于 ==(赋值是=号,所以==规定为等于)5==‘5’ =>true
全等(判断类型等于) ===
全不等(判断类型不等于) !==

逻辑运算

x and $y 逻辑与(并且关系) $x 和$y 为真则返回真
$x && $y 同上 同上
$x or $y 逻辑或 $x,$y均为false时为假,其他情况全为真
$a||$b 同上 同上
!$x 逻辑非 取反,即true变为false,false变为true
$x xor $y 逻辑异或 相同取false,相异为true
短路
逻辑与:如果前面第一个条件为false了,后面就可以不用执行了。
逻辑或:前面第一个条件为true了,后面就不用执行了
但是注意

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1.
$x = false;
$y = 2;
if($x & $y++){
echo '真';
}else{
echo '假';
}
echo $y; //假3
2.
$x = true;
$y = 2;
if($x | $y++){
echo '真';
}else{
echo '假';
}
echo $y; //真3

位运算

$a & $b And(按位与) 将把 $a 和 $b 中都为 1 的位设为 1。
$a | $b Or(按位或) 将把 $a 和 $b 中任何一个为 1 的位设为 1。
$a ^ $b Xor(按位异或) 将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。
~ $a Not(按位取反) 将 $a 中为 0 的位设为 1,反之亦然。
$a << $b 左移 将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。
$a >> $b 右移 将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。

三元运算符和其他运算符

$x? 真代码段:假代码段 判断是否为真假 ? 真情况 : 假情况;
(反引号) 反引号中间插代命令,执行系统命令,等价于shell_exec函数
@ 单行抑制错误,把这一行的错误不让它显示出来了,效率低不建议使用
=> 数组下标访问符
-> 对象访问符
instanceof 判断某个对象是否来自某个类,如果是的返回true,如果不是返回false

流程控制

if、else 语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
1.
<?php
if(布尔条件)
布尔值为真(true)时执行,只能写一行代码;
?>
2.
<?php
if(布尔条件)
布尔值为真(true)时执行,只能写一行代码;
else
布尔值为假(false)时执行,只能写一行代码;
?>
<?php
if(布尔条件){
布尔值为真(true)时执行,多行代码;
}
else{
布尔值为假(false)时执行,多行代码;
}
?>
3.
<?php
if(判断语句1){
执行语句体1
}elseif(判断语句2){
执行语句体2
}else if(判断语句n){
执行语句体n
}else{
最后的else语句可选
}
//后续代码
?>
4.
<?php
if(判断1){
if(判断2){
代码段 1
}else{
代码段2
}
}else{
if(判断3){
代码段3
}else{
代码段4
}
}
?>

switch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
switch(变量){ //字符串,整型
case 具体值:
执行代码;
break;
case 具体值2:
执行代码2;
break;
case 具体值3:
执行代码3;
break;
default:
}
?>

循环结构和相关关键字语句

1.
while(条件){
代码
}
2.
do {
//代码块
} while (判断);
3.
for (表达示1; 表达示2; 表达示3){
需要执行的代码段
}
4.
exit 从当前处停止后续执行
break 跳出循环或者跳出结构体执行后续代码
continue 跳出此次循环,下次循环继续
5.
goto 操作符可以用来跳转到程序中的另一位置。
该目标位置可以用目标名称加上冒号来标记,而跳转指令是 goto 之后接上目标位置的标记。
PHP 中的 goto 有一定限制,目标位置只能位于同一个文件和作用域,也就是说无法跳出一个函数或类方法,也无法跳入到另一个函数。也无法跳入到任何循环或者 switch 结构中。可以跳出循环或者 switch,通常的用法是用 goto 代替多层的 break。
例

1
2
3
4
5
6
7
<?php
goto wan;
echo '天王盖地虎';
wan:
echo '小鸡炖蘑菇';
?>
仅输出 '小鸡炖蘑菇'

函数

自定义函数

function 函数名([参数名1[=值1], 参数名2[=值2], 参数名n[=值n]])
{
函数中的功能体
[return 返回值]
}
1.函数以function开始
2.function后面接空格,空格后接函数名
3.函数名与变量命名规则基本一样,函数名只能是字母,数字,下划线的组合,并且之间不能包含空格,数字不能放在变量名首位,但是不同的是:函数名不区分大小写
4.所谓参数其实就是变量
5.函数名后接括号,括号内跟参数,参数全都有[](中括号)括起来了,代表参数可填可不填
6.如果有参数的话,参数后可以接(=)等号,等号接默认值。参数值也是用[](中括号)括起来的,代表选填
7.函数后的参数变量,主要功能是把函数体外的变量值,传入函数体内来使用,函数体的变量和函数体外的变量通常是两个不 同的变量。
8.函数中的具体功能(功能体)用大括号括起来,代表这是一个函数的功能区间
9.函数可以有返回值也可以没有返回值,用[](中括号)括起来的,代表选填。
10.return后接空格,空格后接返回值,若有return,return后的代码均不执行。
11.函数的执行没有顺序关系,可以在定义处之前的位置调用
12.函数不能被定义两次,即函数不能被重载

回调函数

回调函数,就是在处理一个功能的时候,调用这个函数的时候,还可以传入一个函数配合、协助进行处理
例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function woziji($one,$two,$func){
//我规定:检查$func是否是函数,如果不是函数停止执行本段代码,返回false
if(!is_callable($func)){
return false;
}
//我把$one、$two相加,再把$one和$two传入$func这个函数中处理一次
//$func是一个变量函数,参见变量函数这一章
echo $one + $two + $func($one,$two);
}
//我们定义几个函数试试
function plusx2( $foo , $bar){
$result = ($foo+$bar)*2;
return $result;
}
function jian( $x , $y ){
$result = $x - $y;

return $result;
}
//调用一下函数,woziji,向里面传入参数试试
echo woziji(20,10,'plusx2');
//将plusx2改成jian试试结果
echo woziji(20,10,'jian');
?>

变量函数

联系可变变量定义
例

1
2
3
4
5
6
7
8
9
10
11
12
<?php
function demo(){
echo '天王盖地虎';
}
function test(){
echo '小鸡炖蘑菇';
}
$fu = 'demo';
//把$fu变为了demo,把demo后加上了一个括号,就执行函数了
$fu();
//把$fu的值改为test字符串再试试?
?>

匿名函数

1.变量函数式的匿名函数

1
2
3
4
5
6
7
8
<?php
$greet = function($name)
{
echo $name.',你好';
};
$greet('明天');
$greet('PHP中文网');
?>

2.回调式的匿名函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
function woziji($one,$two,$func){
//我规定:检查$func是否是函数,如果不是函数停止执行本段代码,返回false
if(!is_callable($func)){
return false;
}

//我把$one、$two相加,再把$one和$two传入$func这个函数中处理一次
//$func是一个变量函数,参见变量函数这一章
echo $one + $two + $func($one,$two);
}
woziji(20,30,function( $foo , $bar){
$result = ($foo+$bar)*2;
return $result;
}
);
?>

内部函数

1.内部函数名,不能是已存在的函数名
2.假设在函数a里面定义了一个内部函数,不能定用两次函数a。
例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
function foo()
{
echo '我是函数foo哟,调一下我才会执行定义函数bar的过程<br />';
function bar()
{
echo '在foo函数内部有个函数叫bar函数<br />';
}
}
//现在还不能调用bar()函数,因为它还不存在
// bar();
foo();
//现在可以调用bar()函数了,因为foo()函数的执行使得bar()函数变为已定义的函数
bar();
//再调一次foo()会报错
foo();
?>

变量作用域

1.通过$GLOBLAS来读取外部变量

1
2
3
4
5
6
7
8
9
10
<?php
$one = 10;
function demo(){
$two = 100;
$result = $two + $GLOBALS['one'];
return $result;
}
//你会发现结果变成了110
echo demo();
?>

2.通过$GLOBLAS,在函数内修改外部变量

1
2
3
4
5
6
7
8
$hongniu = '我是一个兵,来自老百姓';
function test(){
echo '执行了函数test哟<br />';
//调用test()函数,将通过$GLOBALS['hongniu'],把$hongniu的值改变掉
$GLOBALS['hongniu'] = '帮助别人很快乐';
}
test();
echo $hongniu;//帮助别人很快乐

3.通过$GLOBLAS,在函数内创建全局变量

1
2
3
4
5
6
function hello(){
$GLOBALS['que'] = '提神喝茶更好哟';
echo '你调了一下函数hello<br />';
}
hello();
echo $que;

参数引用

同比变量引用,将形参和实参指向到同一个位置。如果形参在函数体内发生变化,那么实参的值也发生变化

递归函数

1.代码是从上到下执行的,所有代码没有exit等停止符,函数必须执行完。
2.如果函数从函数A跳至函数B后,必须把函数B执行完成再执行函数A余下的代码。
3.递归函数必须要能执行完有结束条件,不然函数就会限入死循环。函数会永远的自我执行下去。

静态变量

声明一个静态变量,第二次调用函数的时候,静态变量不会再初始化变量,会在原值的基础上读取执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
//--------------如何理解static静态变量-----------

/** 普通局部变量 */
function local() {
$loc = 0; //这样,如果直接不给初值0是错误的。
++$loc;
echo $loc . '<br>';
}
local(); //1
local(); //1
local(); //1
echo '===================================<br/>';

/** static静态局部变量 */
function static_local() {
static $local = 0 ; //此处可以不赋0值
$local++;
echo $local . '<br>';
}
static_local(); //1
static_local(); //2
static_local(); //3
//echo $local; 注意虽然静态变量,但是它仍然是局部的,在外不能直接访问的。
echo '=======================================<br>';

/** static静态全局变量(实际上:全局变量本身就是静态存储方式,所有的全局变量都是静态变量) */
function static_global() {
global $glo; //此处,可以不赋值0,当然赋值0,后每次调用时其值都为0,每次调用函数得到的值都会是1,但是不能想当然的写上"static"加以修饰,那样是错误的.
$glo++;
echo $glo . '<br>';
}
static_global(); //1
static_global(); //2
static_global(); //3
?>

系统内置函数

PHP手册中函数
使用函数的重点是三块:
1.了解函数的功能,特别是常用函数的功能
2.了解函数的参数
3.了解函数的返回值
函数的基本用法的全部注意事项:
1.直接返回布尔型,如bool copy ()
2.带有MIXED参数的函数如何调用。Mixed表示任何类型的数据。如Array_unshift()
3.参数中带有&符的参数,一定要传一个变量做为参数。函数里面改变了他的值。
4.带有[]的参数,表示可选项。
5.带有…的参数,表示可以传任意多个参数。
6.带有callback的参数,表示回调函数。需要传一个函数进来。Array_map()
7.函数支持的版本你要了解

包含函数

可以引入其他文件的函数
函数 包含失败 特点
Inlcude 返回一条警告 文件继续向下执行。通常用于动态包含
Require 一个致命的错 代码就不会继续向下执行。通常包含极为重要的文件,整个代码甭想执行
Include_once 返回一条警告 除了原有include的功能以外,它还会做once检测,如果文件曾经已经被被包含过,不再包含
Require_once 一个致命的错 除了原有的Require功能一外,会做一次once检测,防止文件反复被包含

数学常用函数

函数名 描述 实例 输入 输出
abs() 求绝对值 $abs = abs(-4.2); //4.2 数字 绝对值数字
ceil() 进一法取整 echo ceil(9.999); // 10 浮点数 进一取整
floor() 舍去法取整 echo floor(9.999); // 9 浮点数 直接舍去小数部分
fmod() 浮点数取余 “$x = 5.7;$y = 1.3;$r = fmod($x, $y);// $r equals 0.5, because 4 * 1.3 + 0.5 = 5.7 “ 两个浮点数,x>y 浮点余数
pow() 返回数的n次方 echo pow(-1, 20); // 1 基础数 n次方 乘方值
round() 浮点数四舍五入 echo round(1.95583, 2);// 1.96 一个数值 保留小数点后多少位,默认为0 舍入后的结果
sqrt() 求平方根 echo sqrt(9); //3 被开方的数 平方根
max() 求最大值 “echo max(1, 3, 5, 6, 7); // 7 echo max(array(2, 4, 5)); // 5” 多个数字或数组 返回其中的最大值
min() 求最小值 min 多个数字或数组 返回其中的最小值
mt_rand() 更好的随机数 echo mt_rand(0,9);//n 最小/最大,随机数 随机返回范围内的值
rand() 随机数 echo rand() 最小/最大,随机数 随机返回范围内的值
pi() 获取圆周率值 echo pi(); // 3.1415926535898 无 获取圆周率

获取时间信息函数

UNIX时间戳: 从Unix纪元(1970 年 1月1日零时)开始到一个时间经过的秒数

date_default_timezone_get() 取得一个脚本中所有日期时间函数所使用的默认时区
date_default_timezone_set(‘Asia/shanghai’) 设置所有日期时间函数的默认时区
例
date_default_timezone_set(‘Asia/shanghai’);
echo date_default_timezone_get (); //Asia/shanghai

time() 获取当前时间的 Unix 时间戳。

string date ( string $format [, int $tirnestamp] ) 将一个时间进行格式化输出,以方便时间的显示或存储,返回字符串
如果$timestamp没有输入值,则默认为当前的时间的时间戳。
$format是一个时间输出格式的字符串,需要使用规定的字符构造输出格式。
date函数的格式参数表:
字符 说明 返回值
d 月份中的第几天,有前导零的2 位数字 01 到31
D 英文星期几,3个字母 Mon到Sun
j 月份中的第几天,没有前导零 1 到31
l(字母) 英文星期几 Sunday到 Saturday
N 1格式数字表示的星期 1(表示星期一)到7(表示星期天)
S 每月天数后面的英文后缀,2个字符 st,nd,rd或者th。可以和jg一起用
w 星期中的第几天,数字表示 0(表示星期天)到 6(表示星期六)
z 一年中的第几天 0到366
W 年份中的第几周,每周从星期一开始 42(当年的第42周)
F 月份,完整的文本格式 January 到 December
m 数字表示月份,有前导零 01 到 12
M 3个字母缩写表示的月份 Jan 到Dec
n 数字表示月份,没有前导零 1 到 12
t 给定月份所应有的天数 28 到 31
L 是否为闰年 如果是闰年为1,否则为o
o 格式年份数字 例如2007
Y 4 位数字完整表示年份 例如1999或2008
y 2 位数字表示的年份 例如99或08
a 小写的上午和下午值 am或pm
A 大写的上午和下午值 AM或PM
g 小时,12小时格式,没有前导零 1到12
G 小时,24小时格式,没有前导零 0 到 23
i 有前导零的分钟数 00 到 59
s 秒数,有前导零 00到59
e 时区标识
U 从Unix纪元开始至今的秒数 长整型数字

例
date(‘Y-m-d H:i:s’);//2017-04-28 14:53:01

array getdate ([ int $timestamp = time()) 用来获取当前系统的时间,或者获得一个时间戳的具体含义
函数的返回值是一个根据timestamp得到的包含有时间信息的数组。如果没有参数,则会返回当前的时间。getdate返回的数组,键名包括时间和日期的完整信息
键名 说明 返回值
secnods 秒 数字0到 59
minutes 分钟 数字0到59
hours 小时 数字 0到 23
mday 月份中第几天 数字 1到 31
wday 星期中第几天 数字0(表示星期天)到6(表示星期六)
mon 月份 数字 1 到 12
year 年 4 位数字表示的完整年份
yday 一年中第几天 数字0到365
weekday 星期几的英文 Sunday到 Saturday
month 月份的英文 January 到 December
0 自从Unix纪元开始的秒数 长整型数字

print_r(数组名)可以输出一个数组中所有的键名与值。

bool checkdate(int $month,int $day,int $year) 可以判断一个输出的日期是否有效。返回布尔类型,例如验证用户输入的时间是否正确
例 var_dump(checkdate(2, 29, 2011)); //bool(false) 2011年2月没有29日

int mktime (int $hour [, int $minute [, int $second [, int $month [, int $day [. int$year [, int $.is_dstl.l } ] ] 31 ) 可以对一个日期和时间获得一个本地化时间戳
函数的参数分别表示:时、分、秒、月、日、年、是否为夏令时。在使用这个函数时,需要注意所列的参数要与函数的参数含义相同。

int strtotime ( string $time [, int $now = time() ] ) 将英文文本的日期时间描述解析为 Unix 时间戳
1.传入一个字符串的时间 2.可选参数为是否传入unix时间戳,如果不传则是当前的unix时间戳。
例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//now为现在的当前时间
echo strtotime("now")."<br />";
//2000年9月10日
echo strtotime("10 September 2000")."<br />";
//当前时间加一天
echo strtotime("+1 day")."<br />";
//当前时间加一周
echo strtotime("+1 week")."<br />";
//当前时间加一周2天4小时2秒
echo strtotime("+1 week 2 days 4 hours 2 seconds")."<br />";
//下一个星期四
echo strtotime("next Thursday")."<br />";
//上一个星期一
echo strtotime("last Monday")."<br />";

mixed microtime ([ bool $get_as_float ] ) 能够返回当前 Unix 时间戳和微秒数可用于执行函数时间检测
如果你传入true的话,将会返回一个浮点类型的时间,这样方便参与运算。

字符串常用函数

函数名 描述 实例
trim() 删除字符串两端的空格或其他预定义字符 “$str = “\r\nHello World!\r\n”; echo trim($str);
rtrim() 删除字符串右边的空格或其他预定义字符 “$str = “Hello World!\n\n”; echo rtrim($str);”
chop() rtrim()的别名 同上
ltrim() 删除字符串左边的空格或其他预定义字符 “$str = “\r\nHello World!”; echo ltrim($str);”
dirname() 回路径中的目录部分(我们把它归在了字符串函数里了) echo dirname(“c:/testweb/home.php”);
str_pad() 把字符串填充为指定的长度 $str = “Hello World”; echo str_pad($str,20,”.”);
str_repeat() 重复使用指定字符串 echo str_repeat(“.”,13);
str_split() 把字符串分割到数组中 print_r(str_split(“Hello”));
strrev() 反转字符串 echo strrev(“Hello World!”);
wordwrap() 按照指定长度对字符串进行折行处理 “$str = “”An example on a long word is: Supercalifragulistic””; echo wordwrap($str,15);”
str_shuffle() 随机地打乱字符串中所有字符 echo str_shuffle(“Hello World”);
parse_str() 将字符串解析成变量 “parse_str(“id=23&name=John%20Adams”,$myArray); print_r($myArray);”
number_format() 通过千位分组来格式化数字 “echo number_format(“1000000”); echo number_format(“1000000”,2); echo number_format(“1000000”,2,””,””,””.””);”
strtolower() 字符串转为小写 echo strtolower(“Hello WORLD!”);
strtoupper() 字符串转为大写 echo strtoupper(“Hello WORLD!”);
ucfirst() 字符串首字母大写 echo ucfirst(“hello world”);
ucwords() 字符串每个单词首字符转为大写 echo ucwords(“hello world”);
htmlentities() 把字符转为HTML实体 $str = “”John & ‘Adams’””; echo htmlentities($str, ENT_COMPAT);
htmlspecialchars() 预定义字符转html编码
nl2br() \n转义为
标签 echo nl2br(“One line.\nAnother line.”);
strip_tags() 剥去 HTML、XML 以及 PHP 的标签 echo strip_tags(“Hello world!”);
addcslashes() 在指定的字符前添加反斜线转义字符串中字符 $str = “”Hello, my name is John Adams.” echo $str; echo addcslashes($str,’m’);”
stripcslashes() 删除由addcslashes()添加的反斜线 echo stripcslashes(“Hello, \my na\me is Kai Ji\m.”);
addslashes() 指定预定义字符前添加反斜线 $str = “Who’s John Adams?”;echo addslashes($str);
stripslashes() 删除由addslashes()添加的转义字符 echo stripslashes(“Who\’s John Adams?”);
quotemeta() 在字符串中某些预定义的字符前添加反斜线 $str = “Hello world. (can you hear me?)”; echo quotemeta($str);
chr() 从指定的 ASCII 值返回字符 echo chr(052);
ord() 返回字符串第一个字符的 ASCII值 echo ord(“hello”);
strcasecmp() 不区分大小写比较两字符串 echo strcasecmp(“Hello world!”,”HELLO WORLD!”);
strcmp() 区分大小写比较两字符串
strncmp() 比较字符串前n个字符,区分大小写
strncasecmp() 比较字符串前n个字符,不区分大小写 int strncasecmp ( string $str1 , string $str2 , int $len )
strnatcmp() 自然顺序法比较字符串长度,区分大小写 int strnatcmp ( string $str1 , string $str2 )
strnatcasecmp() 自然顺序法比较字符串长度,不区分大小写 int strnatcasecmp ( string $str1 , string $str2 )
chunk_split() 将字符串分成小块 str chunk_split(str $body[,int $len[,str $end]])
strtok() 切开字符串 str strtok(str $str,str $token)
explode() 使用一个字符串为标志分割另一个字符串 array explode(str $sep,str $str[,int $limit])
implode() 同join,将数组值用预订字符连接成字符串 string implode ( string $glue , array $pieces )
substr() 截取字符串 string substr ( string $string , int $start [, int $length ] )
str_replace() 字符串替换操作,区分大小写 mix str_replace(mix $search,,mix $replace,mix $subject[,int &$num])
str_ireplace() 字符串替换操作,不区分大小写 mix str_ireplace ( mix $search , mix $replace , mix $subject [, int &$count ] )
substr_count() 统计一个字符串,在另一个字符串中出现次数 int substr_count ( string $haystack , string $needle [, int $offset = 0 [, int $length ]] )
substr_replace() 替换字符串中某串为另一个字符串 mixed substr_replace ( mixed $string , string $replacement , int $start [, int $length ] )
similar_text() 返回两字符串相同字符的数量 int similar_text(str $str1,str $str2)
strchr() 返回一个字符串在另一个字符串中开始位置到结束的字符串 string strstr ( string $str, string $needle , bool $before_needle )
strrchr() 返回一个字符串在另一个字符串中最后一次出现位置开始到末尾的字符串 string strrchr ( string $haystack , mixed $needle )
stristr() 返回一个字符串在另一个字符串中开始位置到结束的字符串,不区分大小写 string stristr ( string $haystack , mixed $needle [, bool $before_needle = false ] )
strtr() 转换字符串中的某些字符 string strtr ( string $str , string $from , string $to )
strpos() 寻找字符串中某字符最先出现的位置 int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
stripos() 寻找字符串中某字符最先出现的位置,不区分大小写 int stripos ( string $haystack , string $needle [, int $offset ] )
strrpos() 寻找某字符串中某字符最后出现的位置 int strrpos ( string $haystack , string $needle [, int $offset = 0 ] )
strripos() 寻找某字符串中某字符最后出现的位置,不区分大小写 int strripos ( string $haystack , string $needle [, int $offset ] )
strspn() 返回字符串中首次符合mask的子字符串长度 int strspn ( string $str1 , string $str2 [, int $start [, int $length ]] )
strcspn() 返回字符串中不符合mask的字符串的长度 int strcspn ( string $str1 , string $str2 [, int $start [, int $length ]] )
str_word_count() 统计字符串含有的单词数 mix str_word_count(str $str,[])
strlen() 统计字符串长度 int strlen(str $str)
count_chars() 统计字符串中所有字母出现次数(0..255) mixed count_chars ( string $string [, int $mode ] )
md5() 字符串md5编码 $str = “Hello”; echo md5($str)
iconv

mb_substr 获取字符串的部分 string mb_substr ( string $str , int $start [, int $length = NULL [, string $encoding = mb_internal_encoding() ]] )
mb_http_output 设置/获取 HTTP 输出字符编码 mixed mb_http_output ([ string $encoding = mb_http_output() ] )
mb_strlen 获取字符串的长度 mixed mb_strlen ( string $str [, string $encoding = mb_internal_encoding() ] )
iconv 字符串按要求的字符编码来转换 string iconv ( string $in_charset , string $out_charset , string $str )
iconv_substr 截取字符串的部分
iconv_get_encoding 获取 iconv 扩展的内部配置变量
mb_substr_count 统计字符串出现的次数
mb_check_encoding 检查字符串在指定的编码里是否有效
mb_strrpos 查找字符串在一个字符串中最后出现的位置
mb_split 使用正则表达式分割多字节字符串
parse_url 解释URL成为一个数组

My Little World

排序

发表于 2017-04-14

记录:在排序问题中,通常将数据元素称为记录
–输入一个记录集合,排序后输出也是一个记录集合
–将排序看成是线性表的一种操作
排序依据关键字之间的大小关系,那么对同一记录集合,针对不同的关键字进行排序,可以得到不同的序列

排序稳定性

假设Ki=Kj(1<=i<=n,1<=j<=n,i!=j),且在排序前的序列中ri领先于rj(即i<j)
–如果排序后ri仍领先于rj,则称所用排序方法是稳定的
–反之,若排序后rj仍领先于ri,则称所用排序方法是不稳定的
即原来值相同的两个值A和B,排序前A在B前面,排序后位置不变则说排序算法是稳定的,否则是不稳定的

影响排序算法性能的几个要素

时间性能(比较,移动)
辅助空间(存放临时变量)
算法的复杂性

冒泡排序算法n^2

两两相邻记录的关键字,如果反序则交换,直到没有反序记录为止
注意点:
– 每次比较相邻两个元素
– 如果有n个元素,比较n-1次,每次减少1次比较
– 从下往上比较,即从后往前比较
代码链接

选择排序法n^2

通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1=<i<=n)个记录交换
代码链接

直接插入排序n^2

连续两个值比较若后面的比前面的小,就将后面的值移到比它大的值的前面
适用于记录本身就是有序的,记录数少
代码链接

希尔排序n*logn

将所有元素按一定间隔f取出n/f个进行比较,再按顺序放回对应的位置,直到所有元素参与完比较之后,算完成一轮比较,
再改变间隔进行下一轮比较,直到间隔为1
可以将该处理方法套进冒泡、选择和直接插入的方法中
代码链接

堆排序n*logn

大顶堆;每个结点大于等于其左右孩子的完全二叉树
小顶堆:每个结点小于等于其左右孩子的完全二叉树
各结点一定是堆中所有结点的最大或最小者,如果按照层序遍历方式给结点从1开始编号,则结点之间满足如下关系
大顶堆:Ki>=K2i && Ki>=K2i+1
大顶堆:Ki<=K2i && Ki<=K2i+1
其中(1<=i<=n/2取下限)
下标i与2i和2i+1是双亲和子女关系
堆排序:利用堆进行排序
– 将待排序的序列构造成一个大顶堆(从小到大)(或小顶堆(从大到小))
– 此时整个序列的最大值就是堆顶的根结点。将它移走(就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值)
– 然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的此最大值
– 如此反复执行,便能得到一个有序序列了
代码链接

归并排序

将待排序数组每次一份为2,直到每一份的数组长度为1,
对拆分的两份结果排序合成一个新数组,参与下次下一次比较排序合并
代码链接

快速排序

每趟排序指定一个基准点,把比基准点小的元素放在基准点左边,比基准点大的元素放在基准点右边
再以基准点为界,把前面的数据(都比基准点小)和后面的数据(都比基准点大)按两部分的最小下标为基准准进行移动,
优化
选取基准点
不必要的交换
小数组时的排序方案(使用直接插入排序)
递归操作
尾递归:函数递归形式的调用出现在函数末尾,可以大大缩减栈空间
代码链接

小结

qsort
插入排序类:直接插入排序、希尔排序
选择排序类:选择排序、堆排序
交换排序类:冒泡排序、快速排序
归并排序类:归并排序
sort

My Little World

散列表(哈希表)

发表于 2017-04-09

记录的存储位置 = f(关键字)
散列技术是在存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)
对应关系函数f称为散列函数(哈希函数)
采用三列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表(哈希表)

查找步骤

当存储记录时,通过散列函数计算出记录的散列地址
当查找记录时,通过散列函数计算记录的散列地址,并按此散列地址访问该记录
各记录之间没有任何关系
散列表适合1对1查找,不适合查找范围,也不适合关键字对应多个结果的查找
散列函数通过不同的关键字,计算出了相同地址,称之为冲突

构建散列函数

散列函数原则=计算简单+分布均匀(散列地址)
直接定址法
取关键字的某个线性函数值为散列地址:f(key)=a*key+b
适合查找表小,key比较连续的情况,不常用
数字分析法
适合处理关键字位数比较大的情况
抽取关键字的某几位作为散列地址
平方取中法
平方取中法是将关键字平方之后取中间若干位数字作为散列地址
适合不知道关键字的分布,关键字位数不是很大的情况
折叠法
将关键字从左到右分割成位数相等的几部分,然后将这几部分叠加求和,并按散列表表长取后几位作为散列地址
除留余数法
f(key) = key mod p(p <= m)
m为表长
这个方法不仅可以对关键字直接取模,也可以通过折叠、平方取中后再取模
p的取值是关键,最好接近m的最小质数
随机数法
选择一个随机数,取关键字的随机函数值为它的散列地址
f(key) = random(key)
random为随机函数,适合关键字长度不等的情况
选取方法时要考虑的因素:
计算散列地址所需时间
关键字长度
散列表大小
关键字分布情况
记录查找频率

处理散列冲突的方法

开放定址法
一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入
1.线性探测法
fi(key) = (f(key)+di) mod m
其中di = 1,2,…,m-1
意思是,散列函数计算的地址已经被其他记录占据,就将散列函数计算的地址每次次加1到m-1的一个数,
再mod表长,将每次计算的结果当做新地址去探测有没有记录,如果没有就将该地址做为记录的地址
2.二次探测法
修改一次探测法di的取值
另di = 1^2,-1^2,2^2,-2^2,q^2,-q^2,其中q<=m/2
3.随机探测法
对di采用随机函数计算得到
再散列函数法
fi(key) = RHi(key)(i=1,2,3,…k)
就是用第一个散列函数计算的地址发生冲突就换第二个散列函数,如果第二个也发生冲突,则换第三个,以此类推
链地址法
地址处不存放单一记录,而是存放记录的链表,记录1指向记录2,计算得到地址相同,就继续指下去
公共溢出区法
不发生冲突的关键字放在基本表,将发生冲突的记录依次存放在溢出表,
查找时基本表找不到时就去查溢出表,溢出表找不到再宣告失败

My Little World

多路查找树

发表于 2017-04-08

特点:
每个结点的孩子可以多于两个,且每一个结点处可以存储多个元素
所有元素之间存在某种特定的排序关系
2-3树:每一个结点都具有两个或者三个孩子的多路查找树,所有叶子结点都在同一层次上
2结点:拥有两个孩子和一个元素,左子树包含元素小于结点元素,右子树则大于,要么有两个孩子,要么一个孩子也没有
3结点:拥有三个孩子两个元素,孩子和结点元素呈一定顺序,要么有三个孩子,要么一个孩子也没有
2-3-4树:每一个结点都具有两个或者三个孩子或四个孩子的多路查找树,所有叶子结点都在同一层次上
4结点:拥有四个个孩子三个元素,孩子和结点元素呈一定顺序,要么有四个孩子,要么一个孩子也没有

2-3树插入原理

1.如果是一个空树,直接插入形成一个2结点,即根结点
2.插入到一个结构为2结点的叶子上,直接将该2结点转为3结点
3.插入到一个结构为3结点的叶子结点,而该叶子结点双亲为2结点,则将该双亲2结点扩展为3结点,将元素插进去
4.插入到一个结构为3结点的叶子结点,而其双亲也为3结点,则继续往上找其双亲的双亲是否为2结点,若是,则将该2结点扩展为3结点,将双亲的一个元素挪上去,将3结点的元素挪到双亲,然后插入元素
5.插入到一个结构为3结点的叶子结点,往上追溯到根结点也为3结点,则说明该子树已满,需要增加树的高度,即将树每个结点拆都分成2结点,从而保证,所有叶结点在统一层次

2-3树删除原理

1.删除的元素位于结构为3结点的叶子上,直接删掉就好,3结点变2结点
2.删除元素位于结构为2结点的叶子上,
若双亲也为2结点结构,且双亲另一个孩子为3结点,则将元素删除后,左旋或右旋,将原来双亲移下来做孩子,将原来3结点一个元素移上去做双亲,另一个不动继续做孩子
若双亲为2结点结构,且双亲另一个孩子也为2结点,假设删除的是左子树的元素,则寻找双亲的双亲的直接后继元素来填充双亲的双亲的元素位置,将双亲的双亲的元素做双亲元素的孩子,将双亲元素移下来做孩子,将双亲原来的孩子移上去做双亲
若双亲是一个3结点结构,则将双亲一个元素移下来,3结点变2结点
若删除时,整颗树是一个满2叉树状态,则将树的深度变小,2结点变3结点
3.删除元素位于结构为2结点的双亲位置,若其右孩子为3结点则将其直接后继结点顶上去,3结点孩子变2结点
4.删除元素位于结构为3结点的双亲位置,若其直接前驱位于3结点结构,则将前驱顶上去,3结点变2结点
若其直接前驱位于2结点结构,则将前驱与直接后继合并为3结点,双亲变2结点

B树

一种平衡的多路查找树,2-3树和2-3-4树都是B树的特例
把结点最大的孩子树数目称为B树的阶,因此2-3树是3阶B树,2-3-4树是4阶B树
一个m阶的B树有如下属性
如果根结点不是叶结点,则其至少有两颗子树
每一个非根的分支节点都有K-1个元素和K个孩子,其中K满足:m/2向上取整 <= K <= m
所有叶子结点都位于同一层次
每个分支结点包含元素个数,该结点各元素及其孩子的信息

My Little World

平衡二叉排序树

发表于 2017-04-08

特征

首先得是一颗二叉排序树
左子树与右子树都是平衡二叉树
每个结点左子树与右子树的深度差的绝对值不能大于1
结点左子树深度减右子树深度的差叫做平衡因子BF,即|BF|<=1,BF=-1/1/0
平衡二叉树就是一颗二叉树上所有结点的平衡因子的绝对值小于等于1 的树

关键操作

左子树bf大于右子树bf,右旋
左子树bf小于右子树bf,左旋
左旋的子树的右子树若存在左子树,将该左子树做左旋子树根结点的右子树,左旋子树根结点做其右子树的左子树
右旋的子树的左子树若存在右子树,将该右子树做右旋子树根结点的左结点,右旋子树根结点做其左子树的右子树

构建

现用以下数据构建平衡二叉树
3,2,1,4,5,6,7,10,9,8
balance
按照大于父节点做右子树小于父结点做左子树原则,将3,2,1构建树,当1进入树之后3的左子树深度2减右子树深度0大于1,以2为中心进行右旋,如图1
继续添加4和5,当5进入树之后,3的左右子树深度差为-2,断开2,3链接,将3,4,5,以4为中心左旋,再与2相连,如图2
继续添加6,当6进入树之后,这时2的bf为-2,以2的右子树根结点为中心左旋,此时1,2和3均为4的左子树,则将4的原左子树做新左子树的右子树,如图3
添加7,当7进入树之后,5的bf为-2,断开4,5链接,以6为中心左旋,再与4相连,如图4
添加10、9,当9进入树之后,6的bf为-2,断开6、7,因为10有左结点,先将9、10关系转换,让10做9孩子结点,然后以9为中心左旋,再与6相连,如图5
添加8,4、6的bf又变为-2,断开4、6,9的bf为1,因为将来要对6左旋,所以先将9右旋,使9的bf变成0或负值,再对6以7为中心左旋,如图6
最终结果如图7
代码链接

My Little World

二叉排序树

发表于 2017-04-03

将无序的数组,把首项当做根结点开始,按照比双亲结点小的做左子树,比双亲结点大的做右子树的规则
建立一颗二叉树,对二叉树进行中序遍历,即得到无序数组从小到大的排序
二叉排序树特点
—- 若它的左子树不为空,则左子树上所有结点的值均小于它的根结构的值
—- 若它的右子树不为空,则右子树上所有结点的值均大于它的根结构的值
—- 它的左右子树也分别为二叉排序树(递归)
代码链接

1…171819…25
YooHannah

YooHannah

246 日志
1 分类
21 标签
RSS
© 2025 YooHannah
由 Hexo 强力驱动
主题 - NexT.Pisces