PHP有很多标准的函数和结构,还有一些函数需要和特定的PHP扩展模块一起编译,否则在使用它们的时候就会得到一个致命的“未定义函数”错误。
在PHP中,还允许程序设计者将常用的流程或者变量等元件组织成一个固定的格式,即用户自定义函数。PHP中的函数和C语言一样,包括有返回值及无返回值,函数名不区分大小写,在使用时,在自定义的函数名称前要加入function的保留字,表示这是定义用户自定函数。之后的myfunc可以是任何的英文字母开头的字符串,字符串除了开头不能是数字或是下画线,在第一个字母后可以是阿拉伯数字或者是下画线,当然其他的符号或是中文字不能当函数名。函数名后可以用带多个参数,参数在函数名后的小括号中,之间使用逗号隔开。在参数后的大括号“{}”,即为整个函数的部分。函数如果返回值,使用return可将值返回,而参数可以事先定义初始值或默认值。定义默认值,参数在使用函数时可以省略,但一定要放在没有配置默认值参数的后面,否则PHP在解析函数时,会出现错误。只要参数是PHP支持的变量类型则都可以使用,无论是数组、字符串、或是整数等等,返回值也一样。
下面主要介绍一下PHP中的主要的几组常用的标准函数。
通过这些数学函数,可以处理系统支持的整数和浮点数,常用的数学函数如下。
· abs:绝对值。
· acos:反余弦。
· acosh:反双曲余弦。
· asin:反正弦。
· asinh:反双曲正弦。
· atan2:两个参数的反正切。
· atan:反正切。
· atanh:反双曲正切。
· base_convert:在任意进制之间转换数字。
· bindec:二进制转换为十进制。
· ceil:进一法取整。
· cos:余弦。
· cosh:双曲余弦。
· decbin:十进制转换为二进制。
· dechex:十进制转换为十六进制。
· decoct:十进制转换为八进制。
· deg2rad:将角度转换为弧度。
· exp:计算e(自然对数的底)的指数。
· expm1:返回exp(number)-1,甚至当number的值接近零也能计算出准确结果。
· floor:舍去法取整。
· fmod:返回除法的浮点数余数。
· getrandmax:显示随机数最大的可能值。
· hexdec:十六进制转换为十进制。
· hypot:返回sqrt( num1*num1 + num2*num2)。
· is_finite:判断是否为有限值。
· is_infinite:判断是否为无限值。
· is_nan:判断是否为合法数值。
· lcg_value:组合线性同余发生器。
· log10:以10为底的对数。
· log1p:返回log(1 + number),甚至当number 的值接近零也能计算出准确结果。
· log:自然对数。
· max:找出最大值。
· min:找出最小值。
· mt_getrandmax:显示随机数的最大可能值。
· mt_rand:生成更好的随机数。
· mt_srand:播下一个更好的随机数发生器种子。
· octdec:八进制转换为十进制。
· pi:得到圆周率值。
· pow:指数表达式。
· rad2deg:将弧度数转换为相应的角度数。
· rand:产生一个随机数。
· round:对浮点数进行四舍五入。
· sin:正弦。
· sinh:双曲正弦。
· sqrt:平方根。
· srand:播下随机数发生器种子。
· tan:正切。
· tanh:双曲正切。
例如,如果输入三角形的三条边的长,要求输入这个三角形的周长、面积、三个角的角度数。
在计算时,首先需要判断这三条边的长是否为正数,是否能构成三角形,然后可以将三者相同求出周长,利用海伦公式求出面积,再利用余弦定理计算出各个角的度数。其中海伦公式中需要开方,则可以使用sqrt函数,余弦定理中需要求反余弦,则可以使用acos函数,而acos返回的值为弧度,需要利用rad2deg函数将其转换成角度数。最终的PHP脚本如下:
<form method="POST">
三角形的边长分别为:
<input type="text"name="a">、
<input type="text"name="b">、
<input type="text"name="c">
<input type="submit"name="submit" value="提交">
</form>
<?php
$a=$HTTP_POST_VARS['a']; //获取a的值
$b=$HTTP_POST_VARS['b']; //获取b的值
$c=$HTTP_POST_VARS['c']; //获取c的值
if( $a<0 || $b<0 || $c<0 ) echo '边长必须都为正数';
elseif( $a+$b<=$c || abs($a-$b)>=$c)
echo '这三条边无法构成三角形';
else{
$d=$a+$b+$c;
$p=$d/2;
$s=sqrt($p*($p-$a)*($p-$b)*($p-$c)); //海伦公式
$A=rad2deg(acos(($b*$b+$c*$c-$a*$a)/2/$b/$c)); //计算bc的夹角
$B=rad2deg(acos(($a*$a+$c*$c-$b*$b)/2/$a/$c)); //计算ac的夹角
$C=rad2deg(acos(($a*$a+$b*$b-$c*$c)/2/$a/$b)); //计算ab的夹角
echo "三角形的周长为{$d},面积为{$s},三个角分别为{$A}度、{$B}度、{$C}度";
}
?>
运行结果如图12-18所示,图中测试了勾三股四弦五的情况,结果完全正确。
图12-18 计算三角形的度量
常用的字符串函数如下。
· addslashes:字符串加入斜线。
· bin2hex:二进位转成十六进位。
· chop:去除连续空白。
· chr:返回序数值的字符。
· chunk_split:将字符串分成小段。
· echo:输出字符串。
· explode:切开字符串。
· flush:清出输出缓冲区。
· get_meta_tags:抽出文件所有meta 标记的资料。
· htmlspecialchars:将特殊字符转成HTML格式。
· htmlentities:将所有的字符都转成HTML字符串。
· implode:将数组变成字符串。
· join:将数组变成字符串。
· ltrim:去除连续空白。
· md5:计算字符串的MD5哈希。
· nl2br:将换行字符转成<br>。
· ord:返回字符的序数值。
· parse_str:解析字符串为变量。
· print:输出字符串。
· printf:输出格式化字符串。
· rawurldecode:从URL专用格式字符串还原成普通字符串。
· rawurlencode:将字符串编码成URL专用格式。
· similar_text:计算字符串相似度。
· soundex:计算字符串的读音值
· sprintf:将字符串格式化。
· strchr:寻找第一个出现的字符。
· strcmp:字符串比较。
· strcspn:不同字符串的长度。
· strip_tags:去掉HTML及PHP的标记。
· stripslashes:去掉反斜线字符。
· strlen:取得字符串长度。
· strrpos:寻找字符串中某字符最后出现处。
· strpos:寻找字符串中某字符最先出现处。
· strrchr:取得某字符最后出现处起的字符串。
· strrev:颠倒字符串。
· strspn:找出某字符串落在另一字符串遮罩的数目。
· strstr:返回字符串中某字符串开始处至结束的字符串。
· strtok:切开字符串。
· strtolower:字符串全转为小写。
· strtoupper:字符串全转为大写。
· str_replace:字符串取代。
· strtr:转换某些字符。
· str_word_count:统计字符串中使用的单词数目。
· substr:取部份字符串。
· substr_count:统计指定字符串出现的个数。
· trim:截去字符串首尾的空格。
· ucfirst:将字符串第一个字符改大写。
· ucwords:将字符串每个字第一个字母改大写。
例如,要设计一个网页,包含一个文本区和一个名为“统计”按钮,在文本区中输入一段英文,单击“统计”按钮后,输出这段英文的统计信息,包括这段英文的单词个数、计空格的字符数、不计空格的字符数,以及总句数(假设所有的句子都是以“.”、“?”、“!”这3个标点符号结束),可能的PHP脚本如下:
<form method="POST">
请在下方输入一段英文:<br>
<textarea name="texarea" cols=80 rows=10></textarea><br>
<input type="submit"name="submit" value="统计">
</form>
<?php
$text=$HTTP_POST_VARS['texarea']; //获取输入的文本
echo '总单词数:'.str_word_count($text).'<br>';
$len=strlen($text);
echo '总字符数(计空格):'.$len.'<br>';
echo '总字符数(不计空格):'.($len-substr_count($text,' ')).'<br>';
echo '总句数:' . (substr_count ($text,'.') + substr_count ($text,'!') + substr_count ($text,'?') );
?>
其中,通过str_word_count来直接统计总词数,用strlen函数来测量出文本的总长度,返回为总字符数,然后通过substr_count来统计出其中空格的数目,再利用总长度求出“不计空格的总字符数”,最后通过将“.”、“?”、“!”的个数相加,得到这段话的总句数。
输入一段话后,运行的结果如图12-19所示。
图12-19 字符串函数
数组函数可以用来对数组进行操作,这在数据库操作中是经常使用的,可以在数组与数据库之间互相交流数据。以下为常用的数组函数。
· array:建立一个新的数组。
· array_count_values:统计数组中所有的值出现的次数。
· array_diff:计算数组的差集。
· array_fill:用给定的值填充数组。
· array_flip:交换数组中的键和值。
· array_intersect:计算数组的交集。
· array_key_exists:检查给定的键名或索引是否存在于数组中。
· array_keys:返回数组中所有的键名。
· array_merge:合并两个或多个数组。
· array_pop:将数组最后一个单元弹出(出栈)。
· array_push:将一个或多个单元压入数组的末尾(入栈)。
· array_rand:从数组中随机取出一个或多个单元。
· array_sum:计算数组中所有值的和。
· array_unique:移除数组中重复的值。
· array_values:返回数组中所有的值。
· array_walk:让用户自定函数能处理数组中的每一个元素。
· arsort:将数组的值由大到小排序,并保持键名。
· asort:将数组的值由小到大排序,并保持键名。
· count:计算变量或数组中的元素个数。
· current:返回数组中目前的元素。
· each:返回数组中下一个元素的索引及值。
· end:将数组的内部指针指到最后的元素。
· key:取得数组中的索引资料。
· ksort:将数组的元素依索引排序。
· list:列出数组中元素的值。
· next:将数组的内部指针向后移动。
· pos:返回数组目前的元素。
· prev:将数组的内部指针往前移动。
· range:建立一个整数范围的数组。
· reset:将数组的指针指到数组第一个元素。
· rsort:将数组的值由大到小排序。
· shuffle:将数组的顺序弄混。
· sizeof:获知数组的大小。
· sort:将数组排序。
· uasort:将数组依用户自定的函数排序。
· uksort:将数组的索引依用户自定的函数排序。
· usort:将数组的值依用户自定的函数排序。
例如,要求输入一段英文,统计出每个词的使用频率,并按从高到低的顺序输出,则可以通过如下语句实现。
<form method="POST">
请在下方输入一段英文:<br>
<textarea name="texarea" cols=80 rows=10></textarea><br>
<input type="submit"name="submit" value="统计词频">
</form>
<?php
$text=$HTTP_POST_VARS['texarea']; //获取输入的文本
$texts=explode(' ',$text);
foreach($texts as $key=>$value)$texts[$key]=rtrim($value, ',.?!;');
$freq=array_count_values($texts);
arsort($freq);
foreach($freq as $key=>$value)echo $key.' '.$value.'<br>';
?>
其中,通过explode字符串函数将一段文字以空格为分隔符转换成数组,然后通过rtrim函数,将数组中每个单词右侧的标点符号去掉,然后再通过array_count_values数组函数统计数组中各个单词出现的次数,再通过arsort函数将数组的值从大到小排列,最后通过foreach按顺序打印出数组中每个键和值,输入一段文字后,运行的结果网页如图12-20所示。
图12-20 数组函数
可以用这些时间日期函数得到PHP所运行的服务器的日期和时间,还可以利用这些函数将日期和时间以多种不同方式格式化输出。常用的时间日期函数如下。
· checkdate:验证一个格里高里日期。
· date:格式化一个本地时间/日期。
· getdate:取得日期/时间信息。
· gettimeofday:取得当前时间。
· gmdate:格式化一个GMT/UTC日期/时间。
· gmmktime:取得GMT日期的UNIX时间戳。
· gmstrftime:根据区域设置格式化GMT/UTC时间/日期。
· localtime:取得本地时间。
· microtime:返回当前UNIX时间戳和微秒数。
· mktime:取得一个日期的UNIX时间戳。
· strftime:根据区域设置格式化本地时间/日期。
· strtotime:将任何英文文本的日期时间描述解析为UNIX时间戳。
· time:返回当前的UNIX时间戳。
例如,要将当前时间显示为“2007年3月4日星期日22点00分”这种格式,可以利用getdate函数来实现,查看getdate的函数说明,可得:
array getdate ( [int timestamp])
返回一个根据timestamp 得出的包含有日期信息的结合数组。如果没有给出时间戳则认为是当前本地时间。数组中的索引和意义如下。
· "seconds":秒的数字表示0到59。
· "minutes":分钟的数字表示0到59。
· "hours":小时的数字表示0到23。
· "mday":月份中第几天的数字表示1到31。
· "wday":星期中第几天的数字表示0(表示星期天)到6(表示星期六)。
· "mon":月份的数字表示1到12。
· "year":4位数字表示的完整年份。例如:1999或2003。
· "yday":一年中第几天的数字表示0到366。
· "weekday":星期几的完整文本表示Sunday到Saturday。
· "month":月份的完整文本表示January>到December。
0自从UNIX纪元开始至今的秒数,和time( )的返回值以及用于date( )的值类似。系统相关,典型值为从-2 147 483 648到2 147 483 647。
则可以利用其中相应的键名来生成格式化的时间日期。
<?php
$today = getdate();
echo $today['year'].'年'.$today['mon'].'月'.$today['mday'].'日';
$weekday=array('日','一','二','三','四','五','六');
echo '星期'.$weekday[$today['wday']];
echo $today['hours'].'点'.$today['minutes'].'分';
?>
其中为星期新建了一个数组$weekday,使中文的星期与数字0到6分别相对应。
另外还有很多函数库也比较常用,比如文件函数、目录函数、HTTP函数、FTP函数、URL函数、XML函数、图像函数等,这里就不一一介绍了,读者可以在需要使用这些函数时查询相关的帮助来了解其用法,再逐渐熟练其用法。