静态变量
如果我想知道函数被调用了多少次怎么办?在没有学习静态变量的时候,我们没有好的办法来解决。
静态变量的特点是:声明一个静态变量,第二次调用函数的时候,静态变量不会再初始化变量,会在原值的基础上读取执行。
有了这个特点,我们就可以实现,最开始我们的提问:
函数调用词数的统计。
先执行10次demo()函数试试,再执行10次test()函数试试:
<?php function demo() { $a = 0; echo $a; $a++; } function test() { static $a = 0; echo $a; $a++; } demo(); demo(); demo(); demo(); demo(); demo(); demo(); demo(); demo(); demo(); /* for($i = 0 ;$i < 10 ; $i++){ test(); } */ ?>
上例中你会发现:
test();执行一次数值就会加1,而demo输出的显示结果,始终为0。
通过上例你就会发现,本文开始处说明的静态变量的特点。
系统内置函数
PHP中文网的猪哥,总结了这么两句话:
1.如果代码能赚钱,帮你赚钱最多的是基本语法
2.如果你还在当程序员,你看手册的时候可能比你看老婆的时间还长
现在我们就来学习如何使用系统内置函数。
子曰:送你一条鱼,不如教你捕鱼的办法。
下面我们就来学习捕鱼的办法,在使用系统内置函数前,你必须学会以下几个东西:
1.下载一个**最新的手册**
2.经**常更新手册**
3.将PHP手册放在你最容易找到的地方。需要的时**候随时可以查手册**
4.**学会手册中函数的用法**
你可以访问,下载后放到桌面上,随时需要随时打开查即可:
http://www.php.cn (每周更新一次)
使用函数的重点是三块:
1.了解函数的功能,特别是常用函数的功能
2.了解函数的参数
3.了解函数的返回值
我们针对上面的三块,讲解6个函数,这6个函数,概况了函数的基本用法的全部注意事项:
1.直接返回布尔型,如bool copy ()
2.带有MIXED参数的函数如何调用。Mixed表示任何类型的数据。如Array_unshift()
3.参数中带有&符的参数,一定要传一个变量做为参数。函数里面改变了他的值。
4.带有[]的参数,表示可选项。
5.带有…的参数,表示可以传任意多个参数。
6.带有callback的参数,表示回调函数。需要传一个函数进来。Array_map()
7.函数支持的版本你要了解
实验
1,拿copy()这个函数来举例:返回bool值的,通常为操作是否成功、验证是否通过、检查是否正确等。
我们拿copy这个函数来看:
bool copy ( string $source , string $dest [, resource $context ] )
这个函数的功能为: 拷备一个文件
返回值为为: bool型值,就是成功返回true,失败返回false
参数为: 两个字符串的值,一个是copy的源文件,一个为目标文件。第三个参数可选的,不常用,我们不管它。
所以,我们就可以推理出下面的实验了:
<?php if(copy('abc.txt','bcd.txt')){ echo '复制成功'; }else{ echo '复制失败'; } ?>
Mixed表示任何类型的数据。如Array_unshift()
我们来看这个函数:
int array_unshift ( array &$array , mixed $value1 [, mixed $... ] )
功能: 操作一个数组,向数组中之前插入其他类型的参数。
返回值: int 类型,可能就是插入成功最后的个数
参数: **第一个参数为&符,也就是在操作的过程中,改变了第一个参数的值。**引用传参。也就是操作这个数组,向这个数组中传入参数。会直接改变这个数组的值。
第二个参数为mixed,因为数组可以存入多个不同的类型.mixed是指混合的意思。因此,mixed是指可传入任意类型
第三个数数加了中括号,我们所有遇到中括号的。都是指后面的参数可传,也可以不传。
第四,最后还看到了三个…(省略号)。代表可以传入任意多个参数。
示例:
<?php $queue = array("凤姐", "芙蓉"); array_unshift($queue, "杨幂", "姚晨"); print_r($queue); ?>
你可以自己实验一下,看看结果。
遇到callback的传函数或者匿名函数进去协助处理,让功能更强大。
bool array_walk ( array &$array , callable $callback [, mixed $userdata = NULL ] )
我们来看看。
功能:
传入一个回调函数,将数组的原来的组操作,并且发生变化。
返回值:
bool 值 也就是意味着,提示成功或者失败
参数:
第一个参数是要操作的数组。
第二个参数是callback 代表着可以传入函数或者匿名函数。
我们来写个例子,加强理解:
<?php $shuaige = array("a" => "wuyanzhu", "b" => "huangxiaoming", "c" => "ninzetao"); function test_print($item2, $key) { echo $key ." ---". strtoupper($item2) . "<br />\n"; } echo '<pre>'; var_dump($shuaige); echo '</pre>'; array_walk($shuaige, 'test_print'); echo '用自定义函数test_print执行后的效果:'; echo '<pre>'; var_dump($shuaige); echo '</pre>'; ?>
通过上例,我们发现数组中的每个参数和值都被修改了。上例大家只需要理解看见传callback的,需要传入函数协助处理就可以。不用理解。我们在下一章的数组部份,学习完数组,大家可以再看看。
函数支持的版本号很重要
<?php $shuaige = array("a" => "wuyanzhu", "b" => "huangxiaoming", "c" => "ninzetao"); function test_print($item2, $key) { echo $key ." ---". strtoupper($item2) . "<br />\n"; } echo '<pre>'; var_dump($shuaige); echo '</pre>'; array_walk($shuaige, 'test_print'); echo '用自定义函数test_print执行后的效果:'; echo '<pre>'; var_dump($shuaige); echo '</pre>'; show_source(__FILE__); ?>
文件包含函数
在实际开发中,常常需要把程序中的公用代码放到一个文件中,使用这些代码的文件只需要包含这个文件即可。这种方法有助于提高代码的重用性,给代码的编写与维护带来很大的便利。在PHP中, 有require、require_once、include、include- once四种方法包含一个文件。
我们来对比他们的不同:
函数 包含失败 特点 Inlcude 返回一条警告 文件继续向下执行。通常用于动态包含 Require 一个致命的错 代码就不会继续向下执行。通常包含极为重要的文件,整个代码甭想执行 Include_once 返回一条警告 除了原有include的功能以外,它还会做once检测,如果文件曾经已经被被包含过,不再包含 Require_once 一个致命的错 除了原的功能一外,会做一次once检测,防止文件反复被包含
注意:
1,少用_once带once,因为它会消耗更多的资源去做检测的工作。
2,特高级
Include文件只需要编译一次,因为每次包含include都会再执行一次对应的代码**,如何减少include再次执行时,需要重新解析的过程。**
数学函数 函数名 描述 实例 输入 输出 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 无 获取圆周率 1
设置时区
如果,我们是跨国的多语方程序,我们通常是通过在配置文件里面来写好了个时区,每次程序运行的时候。都会读取这个时区的设置,来显示时间。
设置时区的函数为:
1). date_default_timezone_get() 2).date_default_timezone_set()
第一个函数我们就不重点讲解了,比较简单。
用法如下:
string date_default_timezone_get ( void )
功能如下:
取得一个脚本中所有日期时间函数所使用的默认时区
示例:
<?php echo date_default_timezone_get (); ?>
这样就显示出来了当前设定的时间。
第二个函数是重点:
用法如下:
bool date_default_timezone_set ( string $timezone_identifier )
功能如下:
用于所有日期时间函数的默认时区
示例:
<?php //定义一下时区常量,以后你可以放到配置文件里 define('TIME_ZONE','Asia/shanghai'); //执行函数 date_default_timezone_set(TIME_ZONE); echo date('Y-m-d H:i:s'); ?>
上例的代码对比试试,再将将date_default_timezone_set注释掉,再看看会提示什么。
print_r 输出数组-键值对 <?php $mytime=getdate(); print_r( $mytime); ?>
print_r可以输出一个数组中所有的键名与值。运行这段代码,结果如下所示。程序输出当前计算机的时间与日期详细信息:
Array ( [seconds] => 1 //秒 [minutes] => 10 //分钟 [hours] => 17 //小时 [mday] => 18 //日 [wday] => 0 //星期中的第几天 [mon] => 1 //月 [year] => 2015 //年 [yday] => 17 //年中的第几天 [weekday] => Sunday //星期 [month] => January //月份 [0] => 1421597401 //时间戳 )
php日期验证函数
checkdate可以判断一个输出的日期是否有效。
在实际的工作中,我们需要经常用于检测常用于用户提交表单的数据验证。
例如:验证用户输入的时间是否正确。
函数的语法格式如下:
bool checkdate ( int $month , int $day , int $year )
下例中,我们就可以用一个代码来进行实验,写出一段真实的例子。试试2011年有没有2月29日。
如果是有效的时间就返回真,如果不是有效的时间就返回假。
<?php var_dump(checkdate(12, 31, 2018)); var_dump(checkdate(2, 29, 2011)); ?>
输出结果:
bool(true) bool(false)
获取本地化时间戳函数
在实际的工作中我们还需要经常用到指定某个时间生成。
例如:需要找到昨天到今天此时此刻的注册用户。
那么我们需要做两件事情:
1.得到当前的时间unix时间戳。用time()函数就可以直接搞定
2.那么昨天指定时间该怎么生成呢。这个时候我们就需要使用到mktime()函数。简称:make time.创建时间。
生成出来的时间最好是unix时间戳。因为是1970年1月1日0时到现在的时间。我们做一个区间判断,就把昨天到今天注册的用户按照时间筛选出来了。
我们的mktime()函数可以对一个日期和时间获得一个本地化时间戳。其语法格式如下所示:
int mktime (int $hour [, int $minute [, int $second [, int $month [, int d a y [ . i n t day [. intday[.intyear [, int $.is_dstl.l } ] ] 31 )
函数的参数分别表示:时、分、秒、月、日、年、是否为夏令时。在使用这个函数时,需要注意所列的参数要与函数的参数含义相同。例如,下面的代码实现了用mktime构造一个时间戳的功能。
<?php echo mktime (13 ,15 , 30, 8,18, 2008) ; ?>
运行程序结果如下所示:
1219036530
mktime函数的返回结果是一个Unix时间戳,对用户的含义不大,常常与date函数一起完成时间的转换。
例如,下面的代码实现对时间的运算:
<?php echo date("m-d-Y h:m:s")."\n"; echo date("m-d-Y h:m:s",mktime(10,15,35,date("m"),date("d"),date("Y")))."\n"; echo date("m-d-Y h:m:s",mktime(10,15,35,date("m"),date("d")-30,date("Y")))."\n"; ?>
我们使用的时候还经常需要使用到另外一个函数:strtotime()。
它的语法格式如下:
int strtotime ( string $time [, int $now = time() ] )
它能将将英文文本的日期时间描述解析为 Unix 时间戳。
参数:
1.传入一个字符串的时间
2.可选参数为是否传入unix时间戳,如果不传则是当前的unix时间戳。
我们来实验一下,看看手册中提供的一些例子:
<?php //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 />"; ?>
通过上例发现,把一些时间通通加上了或者减去了英文中所表示的指定时间段。
程序执行时间检测
我们有的时经常需要做程序的执行时间执行效率判断。
实现的思路如下:
<?php //记录开始时间 //记录结整时 // 开始时间 减去(-) 结束时间 得到程序的运行时间 ?>
可是大家不要忘了,程序的运行速度太快了。快到只有0.00000几秒的一刹那。那这个时候大家要记录一个特函的函数了:
mixed microtime ([ bool $get_as_float ] )
microtime()这个函数,能够返回当前 Unix 时间戳和微秒数。
参数:
如果你传入true的话,将会返回一个浮点类型的时间,这样方便参与运算。
我们来模拟一个检测函数执行时间的例子,测试某个函数效率的快慢:
<?php //开始时间 $time_start = microtime(true); //循环一万次 for($i = 0 ; $i < 10000 ; $i++){ //你可以用上,mktime() 生成一个昨天的时间 //再用strtotime() 生成一个昨天的时间 //对比两个函数认的效率高 } //结整时间 $time_end = microtime(true); //相减得到运行时间 $time = $time_end - $time_start; echo "这个脚本执行的时间为 $time seconds\n"; ?>
最后输出的结果就是我们实际的函数的执行时间。你可以多对比几次,看看最终的结果。
谁的时间短,在实际的工作中,你就可以经常使用哪个函数。
字符串常用函数
数组、字符串和数据库是我们函数里面最、**最、最常用的三类函数,**数组和数据库我们现在还没有讲到,等讲到的时候我们再来和大家细说。
当然PHP的字符串函数也有很多。我们最常使用的两个系列的字符串:
1.单字节字符串处理函数
2.多字节字符串处理函数
3.字符串编码转换函数
我们来说说为什么要学这么多函数:
1.我们学的是中文,是双字节或者三字节的。老外的函数只能处理英文和数字这些单字节的字符串处理不鸟中文。达不到我们的功能需求
2.有的时候需要做不同字符编码间的转换,例如:把GBK的转为UTF-8
3.英文这些字符在电脑里又是必须要处理的
因此,我们要学三个类型的常用字符串函数。
我们来贴个PHP手册的链接给大家看看:
PHP常用函数:
函数名 描述 实例 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成为一个数组
注:mb_* 和iconv_* 他们可以处理多字节字符,例如:中文。
中文主要用的是GBK和utf-8两种编码格式。
GBK和utf-8是两个不同的编码委员会对于汉字进行的编码的标准。
他们规定GBK是双字节,也就是一个汉字占用2Bytes。
utf-8是三字节,一个汉字占用三个字节长度的存储空间。
数组 索引
不过上面的例子中,我们觉得写的不优美,我们可以将代码写的更加优美一些,格式更加清晰一些。
<?php $kele = array( '只有不断努力才能博得未来', 10 => 'NoAlike', 'PHP中文网' , '去PHP中文网学PHP', 19 => '凤姐和芙蓉我都爱' , '杨幂我最爱' ); //打印显示$kele echo '<pre>'; var_dump($kele); echo '</pre>'; ?>
这样是不是看得更清楚,一行对应一个数组的值。
通过上面的效果,我们来总结规律:
1.索引数组若不强制声明他的下标,他的下标是从0开始的。(我们的第一个数组的值:只有不断努力才能博得未来。这个值的下标为0)。
2.如果我指定过下标他的下标就为我指定的值。如下标为10和下标为19的,都是我指定过的值。
3.若某个值(如NoAlike),强制指定了下标(下标为10)。在它后面加上的值(PHP中文网),不指定下标的话。他们的下标增长规律为最大值+1。
例如:凤姐和芙蓉我都爱的下标为19.我在后面加上了:杨幂我最爱。它的下标自动增长为了11。
不知不觉,你已经学会了索引数组的创建,神奇吧?真为你感到高兴!
二维索引数组
<?php $a[0] = 1; $a[1] = 3; $a[2] = 5; $result = count($a); // $result == 3 $b[0] = '迪奥和奥迪我都爱'; $b[5] = '努力开创未来'; $b[10] = '为了未来而努力'; $result = count($b); $data = [ 'baidu' =>'百度', 'ali' => '阿里', 'tencent' => '腾讯', ]; echo count($data); $erwei = [ [ 'baidu' =>'百度', 'ali' => '阿里', 'tencent' => '腾讯', ], [ 'netease' =>'网易', 'sohu' => '搜狐', 'sina' => '新浪', ] ]; //试试输出一个二维数组个数 echo count($erwei); //试试输出二维数组中某个元素的个数 echo count($erwei[1]); ?>
foreach遍历关联数组
我们通过上一章的内容学会了遍历连续下标的索引数组。可是,我们发现我们遍历不了关联数组,也遍历不了下标不连续的索引数组。
那我们其实在学循环的时候,有一个布尔型循环是专门用来循环数组的。这个循环的基本语法就是foreach基本语法。
语法格式如下:
foreach( 要循环的数组变量 as [键变量 =>] 值变量){ //循环的结构体 }
遍历关联数组
这是一个固定用法,将要循环的数组放进去。
as 是一个固定的关键字
后面的键变量是可选的,随意定义一个变量,每次循环的时候,foreach这个语法会把键取出来赋值到键变量里面
后面的值变量是必填的。每次循环的时候,会把值放到值变量里面。
<?php $data = [ 'fj' => '凤姐', 'fr' => '芙蓉', ]; foreach($data as $key => $value){ echo $key . '-------' . $value . '<br />'; } //如果我们只想读取值的话,就可以把下面的$key => 给删除掉,读取的时候,就只读取值了。做完上面的实验,你可以打开下面的代码再实验几次。 /* foreach($data as $value){ echo $value . '<br />'; } */ ?>
<?php $data = array( 0 => '中国', 100 => '美国', 20 => '韩国', 300 => '德国', ); //待会儿可以自己做做实验,循环遍历一下下面的这个数组 //$data = array(1,2,3,4,5,6,7,8,9,10); foreach($data as $k => $v){ echo $k . '------' . $v .'<br />'; } ?>
list、each函数遍历数组
我们来研究两个比较有意思的数组函数。这两个函数学起来不难。但是,有些同学会遇到一点点小困难。困难在于,找到list函数和each函数的操作特点。
list函数
我们先来讲list函数:
list ( mixed $变量1 [, mixed $变量n ] )
它的功能:将索引数组下标为0的对应我变量1,下标1的对应变量2,依此类推。
我们来通过实验来看一下:
<?php list($one , $two , $three) = array('张三' ,'李四' ,'王五'); //再次声明:单引号不结释变量,所以输出的是字符串$one echo '$one----'.$one.'<br />'; echo '$two----'.$two.'<br />'; echo '$three----'.$three.'<br />'; ?>
正则表达式
世界上最难懂的是道士的鬼符、医生的处方和程序员的正则表达示。
我们先看一个正则表达示的样子:
/^a-z@([a-z0-9][-_]?[a-z0-9]+)+[.][a-z]{2,3}([.][a-z]{2})?$/i
呵呵,看着就觉得揪心。提前声明,别被吓着,学习一下后你会发现没那么困难。
正则表达示我们其实之前经常看到,它主要用在以下一些地方:
匹配邮箱、手机号码、验证码
替换敏感的关键词。例如:涉及政治和骂人的话
文章采集。
早期的表情替换技术,ubb文件编码、markdown编辑器替换等
以后自己写模板引擎也需要用到正则表达示
其他....
界定符
定界符,就是定一个边界,边界已内的就是正则表达示。
PHP的正则表达示定界符的规定如下:
定界符,不能用a-zA-Z0-9\ 其他的都可以用。必须成对出现,有开始就有结束。
我们来例几个例子:
例子 说明
/中间写正则/ 正确
$中间写正则$ 正确
%中间写正则% 正确
^中间写正则^ 正确
@中间写正则@ 正确
(中间写正则) 错误
A中间写正则A 错误
注:\ 是转义字符,如果在以后正则表达示里面需要匹配/,如下图:
这个时候真要匹配/ 的时候,需要把定界符里面的/ 用转义字符转义一下,写成下面的例子:
如果你觉得麻烦,遇到这种需要转义的字符的时候可以把两个正斜线(/ /)定界,改为其他的定界符(# #)。
正则表达示中的原子
原子
原子是正则表达示里面的最小单位,原子说白了就是需要匹配的内容。一个成立的正则表达示当中必须最少要有一个原子。
所有可见不可见的字符就是原子
说明:我们见到的空格、回车、换行、0-9、A-Za-z、中文、标点符号、特殊符号全为原子。
在做原子的实例前我们先来讲解一个函数,preg_match:
int preg_match ( string $正则 , string $字符串 [, array &$结果] )
功能:根据$正则变量,匹配$字符串变量。如果存在则返回匹配的个数,把匹配到的结果放到$结果变量里。如果没有匹配到结果返回0。
注:上面是preg_match常用的主要几个参数。我在上面将另外几个参数没有列出来。因为,另外两个参数太不常用了。
<?php $zz = '/[0-5]\w+/'; $string = '6a'; $string1 = '1C'; if(preg_match($zz, $string1, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>
<?php $zz = '/[^0-9A-Za-z_]/'; $string = 'aaaaab311dd'; $string1 = '!$@!#%$#^##'; if(preg_match($zz, $string1, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>
原子 等价式 \w [a-zA-Z0-9_] \W [^a-zA-Z0-9_] \d [0-9] \D [^0-9] \s [ \t\n\f\r] \S [^ \t\n\f\r]
写正则的诀窍和常用正则
写正则的诀窍
女孩和男孩恋爱时的诀窍通常是:测试你是不是对我好一点,如果是的,咱们的关系就更好一点。
而正则的诀窍和恋爱的诀窍基本一致:写一点、测一点。
因为,我们需要不断的正则,用preg_match对比是不是能匹配成功。成功了,再写后面的一点**。直到写完,全部匹配成功为止!**
例如,我要写一个邮箱的正则。我先要做的事情,将常用的邮箱格式全部列出来。例如:
phpcn@php.cn phpcn@corp.baidu.cm phpcn@126.com phpcn@xxx.com 12345@qq.com
常用的格式主要有这样一些。那我们就可以来分析:
1.先匹配@之前的字符 \w+(因为是0-9A-Za-z_)
2.第二个跟一个@符
3.第三个再写上[a-zA-Z0-9-]+ 因为qq和126这些主域名是不能有下划线的
4.corp.baidu. 或者是126. 通常邮箱后缀都是这样的。所以我们可以写成:([a-zA-Z0-9-]+.){1,2}
5.上面的是将.转义,让它是本身的意思。括号重复的区间最少一次,最多两次。
6.后面接下com|cn|org|gov.cn|net|edu.cn等就可以了
因此,我们的正则表达示在我使用:
/\w+@([a-zA-Z0-9-]+.){1,2}(com|cn|org|gov.cn|net|edu.cn)/
1
邮箱的正则就被我写成功了。
常用正则函数
我们常用的正则函数有:
函数名 功能 preg_filter 执行一个正则表达式搜索和替换 preg_grep 返回匹配模式的数组条目 preg_match 执行一个正则表达式匹配 preg_match_all 执行一个全局正则表达式匹配 preg_replace_callback_array 传入数组,执行一个正则表达式搜索和替换使用回调 preg_replace_callback 执行一个正则表达式搜索并且使用一个回调进行替换 preg_replace 执行一个正则表达式的搜索和替换 preg_split 通过一个正则表达式分隔字符串
大家针对这这些函数,对着手册用一下。有问题或遇到问题可以来我们的官网提问。
正则关于面试常遇到的问题
面试中经常考到的几个正则达达示是:
1.匹配邮箱
2.匹配手机号
3.匹配一个网址
4.用正则匹配某个格式,取出某个例
5写一个采集器
其他....
面试的第4题和第5题我对大家不担心,因为只要大家认真学习了我给的前五节的内容。第4,5题推理就行。
因为,通常在技术答题面试环节,是时候准许查手机的!
常用正则表达示
下面的是快速查找的正则表达示,大家一定得知道具体意思。
需要的时候直接复制即可:
用正则写一个UBB文本编辑器
我们来看一下UBB编辑器。这是网站当中经常用到的文本处理技术。因为使用UBB文件编辑器,我指定的格式才能存在。我不指定的格式,用户是无法在网站中展现的。
我们来看看效果:
<?php $string='[b]为你写诗[/b] [i]为你做不可能事[/i] [u]哎呀,哥不是写情诗[/u] [color=Red]哥是在说歌词[/color] [size=7]吴克群[/size] [qq]123123123[/qq]'; //匹配UBB字符 $pattern=array( '/\[b\](.*)\[\/b\]/i', '/\[i\](.*)\[\/i\]/iU', '/\[u\](.*?)\[\/u\]/i', '/\[color=(.*?)\](.*?)\[\/color\]/', '/\[size=(\d)\](.*?)\[\/size\]/', '/\[qq\](\d{5,12})\[\/qq\]/', ); //需要替换的UBB字符 $replace=array( '<b>\\1</b><br />', '<i>\\1</i><br />', '<u>\\1</u><br />', '<font color="\\1">\\2</font><br />', '<font size="\\1">\\2</font><br />', '<a href="http://wpa.qq.com/msgrd?V=1&Uin=\\1&Site=[Discuz!]&Menu=yes" target="_blank"><img src="http://wpa.qq.com/pa?p=1:\\1:1" border="0"></a>', ); //使用正则匹配$string,将$string当中的值变为$replace的效果 $ubb=preg_replace($pattern,$replace,$string); echo $ubb; ?>
实现的更高级,你可以让用户传过来的是form表单中的结果,让用户传值过来。
你转换输出成UBB格式。
下一章节中我们学习了文件系统的知识,再跟大家讲解更加有趣的:网页采集器。