global与static变量
(面试题)
global:[用于在函数内使用全局变量+值不变]在php中function体内无法使用全局变量,如果要使用的话,需要使用global关键字先声明在使用
$a = 'hello';
function M1() {$a = 'mysql';global $a;echo $a;}
echo $a; M1();//结果=hellohello
static:[用于保留局部变量一直存在+值可变]当函数运行完毕时,函数内的变量都会被消除,如果还需要使用不希望被删除的话,使用static关键字。仅在第一次声明变量的时候使用。
$count = 5;
function get_count(){static $count=0; return $count++;}
++$count;get_count();echo get_count();//结果=1
(字符串ascii码|url|变量)与数组的转换
explode与implode区别,chr(83)与ord('S')区别,parse_url+parse_str与http_build_query区别,extract与compact区别
反转
字符串反转strrev,数组反转array_reserve,array_flip
截取与替换
字符串的截取substr与替换substr_replace,str_replace区别,数组的截取array_slice与替换array_splice区别
其中,substr_replace('abcdef', '###', 1, 2);//输出 a###def str_replace("world", "earth", "Hello world!");//输出 Hello earth!
array_slice原数组不受任何影响,但是array_splice原数组会真的被切去一部分,在切去部分前面插入补足的部分
分割与填充
字符串的分割str_split,chunk_split与填充str_pad区别,数组的分割array_chunk与填充array_pad区别,
其中,分割:chunk_split('abcdef',2,',')与array_chunk($arr,2),填充:str_pad($str,$len,'0',STR_PAD_LEFT)与array_pad($arr, 5, 'a');
数组的操作对比
array_walk与array_map3个区别
数组的排序
sort,rsort与ksort,krsort与asort,arsort与natsort,natcasesort区别,
多维数组排序array_multisort($col,SORT_REGULAR,$arr)
数组的并差交
数组并集array+array,array_merge,array_combine的区别,差集array_diff与交集array_intersect
数组的增删元素
数组头的插入array_unshift与移除array_shift,数组尾的插入array_push与移除array_pop
字符串首字母大写
ucfirst,lcfirst,ucwords,lcwords,strtoUpper,strtoLower区别
字符串模式匹配
preg_match($pattern,$input,$output)与preg_match_all($pattern,$input,$output)
文件与目录 php操作文件:fopen/fclose,is_file,fgets,fread/fwrite
php操作目录:opendir/closedir,is_dir,readdir
问题1 ( $key??'默认值' ) 与 ( !empty($key)?$key:'默认值' ) 的区别
答:前者还要$key只要!=null,都能取得到, ??就相当于isset()
问题2 ?: 与 ??的区别(php取数组中不存在的属性_wuhuagu_wuhuaguo的博客-CSDN博客_php数组不存在)
答:安全的获取数组属性,有2种方式,一种是$a['a1']??'' ,一种是!empty($a['a2'])?$a['a2']:''
问题3 ==与===的区别
答:==是比较两者的数值是否相同,===比较两者的类型和数值是否相同
$str = 'http://www.google.com';
if ( strpos($str,'http')==false ) ===> true
if ( strpos($str,'http')===false ) ===> false
//strpos($str,'http')=0,0==false,但是0!===false
问题4 判断是否是一维数组
count($param) == count($param,1)
问题5 获取13位毫秒时间戳
//microtime()='0.79025500 1584618180',microtime(true)=1584618180.7903
//在32位系统中php的int最大值远远小于毫秒数,所以不能使用int类型,而php中没有long类型,所以只好使用浮点数来表示。由于使用了浮点数,如果精度设置不对,使用echo显示获取的结果时可能会不正确,要想看到输出正确的结果,精度设置不能低于13位。
$micro13Time = (float)sprintf('%.0f', floatval(microtime(true)*1000));
问题6 获取url中的后缀名,如.php
$urlArr = parse_url($bpmFileUrl);
$basename = basename($urlArr['path']??'');
$suffix = substr($basename, strpos($basename, '.'));
问题7 判断{函数/类/方法/属性}是否存在(滴滴面试题)
//(1)判断类是否存在
bool class_exists(string $class_name [, bool $autoload = true])
//(2)判断系统函数或自己写的函数是否存在
bool function_exists(string $function_name)
//(3)判断类里面的某个方法是否已经定义
bool method_exists(mixed $object, string $method_name)
//(4)判断类里面的某个属性是否已经定义
bool property_exists(mixed $class, string $property)
问题7 PHP foreach的坑(百度面试题)
$test = [1,2,3,4];
foreach ($test as &$v) {}
echo json_encode($test); echo '<hr>'.$v.'<hr>';
foreach ($test as $v) {echo $v.'=>'.json_encode($test).'<hr>';}
// [1,2,3,4]
// 4
// 1=>[1,2,3,1]
// 2=>[1,2,3,2]
// 3=>[1,2,3,3]
// 3=>[1,2,3,3]
解释:foreach通过引用&遍历的时候,在遍历结束之后,会产生一个隐藏的变量$v,该$v是数组最后一个元素的引用,$v和数组中的最后一个元素存在一个地址,其中的一个值发生变化,都会引起另外一个值的变化。
第二次遍历用了同样的迭代变量$v,在这次foreach迭代的过程中,$v的值不断的被覆盖。
第一次迭代,数组变化成 [1,2,3,1],第二次变化成 [1,2,3,2],… 一直到倒数第二次,数组变成了[1,2,3,3],导致了最后两个元素相同,最后一次,3覆盖3,迭代结束。最终结果=[1,2,3,3]
问题9 php5.6语法糖(...$args) func1(参数1,...[参数2,参数3,,,参数N]);
function add($a, $b, $c)
{
return $a + $b + $c;
}
$num=[2, 3];
echo add(1, ...$num);//6
//上面的第二个和第三个参数将会从b为2,$c为3)
问题10 !empty()与isset()区别
null false 0 "" [ ]
!empty() F F F F F
isset() F T T T T
问题11 重载 与 覆盖(重写) 的区别
重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。 调用的时候根据函数的参数来区别不同的函数。
覆盖(重写)是指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现。 即函数名和参数都一样,只是函数的实现不一样。
问题12 array_column
$arr = [
['id'=>1, 'name'=>'zs', 'sex'=>'man', 'grade'=>'100'],
['id'=>2, 'name'=>'wl', 'sex'=>'female', 'grade'=>'90'],
];
$b = array_column($arr, null, 'id');//仍然是二维数组
// [
// '1' => ['id'=>1, 'name'=>'zs', 'sex'=>'man', 'grade'=>'100'],
// '2' => ['id'=>2, 'name'=>'wl', 'sex'=>'female', 'grade'=>'90'],
// ]
$c = array_column($arr, 'name', 'id');//一维数组
// [
// '1' => 'zs',
// '2' => 'wl',
// ]
常用函数
echo()【语言结构】
print()//【语言结构】【有返回值】,若传输失败导致没有输出,它返回false
var_dump()
var_export()【有返回值,翻译一个合法的PHP代码】
printf()//类似与C语言的形式 printf("my name is %s, age %d", $name, $age);,打印出来
sprintf()//跟printf相似,但不打印,而是返回格式化后的文字,其他的与printf一样
//https://www.cnblogs.com/pjdsy/p/4663590.html php之数据类型自动转换
//echo输出字符串,bool,int会自动转字符串
//bool与int转换:true=1,false=0
//bool与string转换:true='1',false='',不是'0'哦!!!!
echo 0;echo ';';echo 1;//0;1
echo '<br>';
echo false;echo ';';echo true;//;1
echo '<hr>';
echo 'a'.(int)false;echo ';';echo 'b'.(int)true;//a0;b1
echo '<br>';
echo 'a'.false;echo ';';echo 'b'.true;//a;b1
----------------------------------------------------------------------------------------------------------------------------------------------------------
数组函数
1.排序类:【1.无返回值,传值引用,就直接对原数组进行了修改】
sort() 函数用于对数组单元从低到高进行排序。
rsort() 函数用于对数组单元从高到低进行排序。
ksort() 函数用于对键名从低到高进行排序并保持索引关系。
krsort() 函数用于对键名从高到低进行排序并保持索引关系。
asort() 函数用于对数组单元从低到高进行排序并保持索引关系。
arsort() 函数用于对数组单元从高到低进行排序并保持索引关系。
natsort() 函数用于对数组单元从低到高进行区分大小写的排序并保持索引关系。
natcasesort() 函数用于对数组单元从低到高进行不区分大小写的排序并保持索引关系。大写在前,小写在后。
usort($arr,"strnatcmp") 回调类的排序,把$arr数组里的每一个元素丢到strnatcmp()[非自然数排序]处理【返回新的排序数组】
==>sort,rsort与ksort,krsort asort,arsort natsort,natcasesort区别:
1组与234组比较:第1组抛弃键名,后234组保留键名
2组与34组比较:第2组按照键名排序,第34组按照键值排序
3组与4组比较:第3组按照键值排序,第4组按照键值ASCII码自然排序
$arr=array("a"=>"d","d"=>"c","b"=>"a");sort($arr);var_dump($arr);
//array(3) { [0]=> string(1) "a" [1]=> string(1) "c" [2]=> string(1) "d" }
$arr=array("a"=>"d","d"=>"c","b"=>"a");ksort($arr);var_dump($arr);
//array(3) { ["a"]=> string(1) "d" ["b"]=> string(1) "a" ["d"]=> string(1) "c" }
$arr=array("a"=>"d","d"=>"c","b"=>"a");asort($arr);var_dump($arr);
//array(3) { ["b"]=> string(1) "a" ["d"]=> string(1) "c" ["a"]=> string(1) "d" }
$arr=['a'=>'Img12.png','b'=>'img2.png','c'=>'Img1.png'];asort($arr);var_dump($arr);
//array (size=3) {'c' => string 'Img1.png' 'a' => string 'Img12.png' 'b' => string 'img2.png'}
$arr=['a'=>'Img12.png','b'=>'img2.png','c'=>'Img1.png'];natsort($arr);var_dump($arr);
//array (size=3) {'c' => string 'Img1.png' 'a' => string 'Img12.png' 'b' => string 'img2.png'}
$arr=['a'=>'Img12.png','b'=>'img2.png','c'=>'Img1.png'];natcasesort($arr);var_dump($arr);
//array (size=3) {'c' => string 'Img1.png' 'b' => string 'img2.png' 'a' => string 'Img12.png'}
function my_sort($a,$b){
if ($a==$b) return 0;
return ($a<$b)?-1:1;
}
$a=array(4,2,8,6);
usort($a,"my_sort");
$arrlength=count($a);
for($x=0;$x<$arrlength;$x++) echo $a[$x]." ";
//2 4 6 8
//根据时间对多维数组排序
$a=array(
array('name'=>'zs','time'=>'2017-10-25 12:04:13'),
array('name'=>'l s','time'=>'2017-10-25 12:34:13'),
array('name'=>'ww','time'=>'2017-10-23 12:34:13')
);
foreach($a as $key=>$val) $t[]=date('YmdHis',strtotime($val['time']));
array_multisort($t,SORT_DESC,$a);
// print_r($a);
2.键值操作类:【都有返回值,没有在原来参数上修改】
1.array_values($arr);//获取$arr中的值重排,去掉下标【返回值新索引数组】
2.array_keys($arr[,"str",true])//获取$arr中所有字符是"str"的下标,形成索引数组,true表示区分大小写【返回新索引数组】
3.array_search("is",$arr[,true]) //返回值"is"在$arr中的key,找不到返回fales,true表示严格按照类型(8,"8")【返回第一个匹配值】
4.in_array("str",$arr);//判断"str"在$arr中是否存在,【返回BOOL】
5.is_array($arr);//判断是否是数组【返回BOOL】
6.array_key_exists($key,$arr); //查询$arr中是否有$key,【返回BOOL】
7.array_flip($arr);// 交换键值,如有重复,后来居上,【返回新数组】
8.array_reverse($arr,[true|false]);//数组顺序反转,param2是否保留原来键值【返回新关联/索引数组】
9.array_column(array(),'name'[,name_two]) — 返回数组中指定的name列[可选参数,如果有返回name=>name_two的形式]【返回一维数组】
3.元素个数和唯一性
1.array_unique($arr);//去掉$arr中的重复值,重复的保留第一个值,【返回数组,键值保留】
2.array_count_values($arr)//统计数组值出现的次数,【返回数组,KEY为原来数组的值,VALUE为统计的次数】
3.count($arr[,1])/sizeof();//统计$arr的元素个数,参数"1"表示统计多维数组开启,默认0为关闭【返回统计个数】
4.回调函数
1.array_filter($arr,"function");//把$arr放到函数function中处理,【返回判断为TRUE的数据组成新数组,键值保留】
2.array_walk($arr,"function"[,"data"]);//把$arr放到function(&$v,$k,$data)中处理【返回值为bool】
3.array_map("function",$arr,$arr2,$arr3,....);//把所有数组返回到回调函数统一处理,【返回数组】
4.array_reduce($arr,myfunction[,initial]):把一维数组$arr中的值依次传到自定义函数myfunction($v1,$v2)的v2上,v1为累加值类似 于( .= ),[如果有initial,先把其当v1传进去]【返回字符串】
============
array_walk与array_map区别
php array_map与array_walk使用对比_wml-CSDN博客
(1)walk主要是对每个参数都使用一次你的回调函数,要的是处理的过程。map对每个参数都使用一次你的回调函数,主要是为了得到你的回调函数处理后的新数组,要的是结果。
(2)walk可以没有返回值,它主要是要对数组内的每个值进行操作,操作结果影响原来的数组。map主要是对数组中的值进行操作后返回数组,以返回一个新数组。
(3)walk可以认为提供额外参数给回调函数,map不可以。
array_walk array_map
面向过程,直接操作原数组 面向结果,返回新数组
数组在前,函数在后 函数在前,数组在后
函数可额外参数 数组可多个
<?php
//array_walk举例
function myfunction1($value,$key,$p){
echo "$key $p $value<br>";
}
$a=array("a"=>"red","b"=>"green","c"=>"blue");
array_walk($a,"myfunction1","has the value");
/*
a has the value red
b has the value green
c has the value blue */
//array_map举例
function myfunction2($v){
return($v*$v);
}
$a=array(1,2,3,4,5);
$re=array_map("myfunction2",$a);
print_r($re2);
/* Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 16 [4] => 25 ) */
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
function test_alter(&$item1, $key, $prefix){
$item1 = "$prefix: $item1";
}
function test_print($item2, $key){
echo "$key => $item2<br>";
}
echo "Before<br>";
array_walk($fruits, 'test_print');
array_walk($fruits, 'test_alter', 'fruit');
echo "After<br>";
array_walk($fruits, 'test_print');
/*
Before
d => lemon
a => orange
b => banana
c => apple
After
d => fruit: lemon
a => fruit: orange
b => fruit: banana
c => fruit: apple
*/
function myfunction5($v1,$v2)
{
if($v1===$v2) return "same";
return "different";
}
$a1=array("Horse","Dog","Cat");
$a2=array("Cow","Dog","Rat");
$re=array_map("myfunction5",$a1,$a2);
print_r($re2);
/* Array ( [0] => different [1] => same [2] => different )*/
?>
2)有个需求,二维数组里的city与name不能同时重复。这样就必须取内层每个数组的city和name。儿array_column只能取一个字段,想到用array_walk或者array_map
//方法1:array_walk
$res = [];
array_walk($list, function ($val,$key) use (&$res) {
$res[] = [$val['city'], $val['name']];
});
if (count($res) != count(array_unique($res, SORT_REGULAR))) {
echo '重复';
} else {
echo '不重复';
}
//方法2:array_map
$res = [];
array_map(function ($val) use (&$res) {
$res[] = [$val['city'], $val['name']];
},$list);
if (count($res) != count(array_unique($res, SORT_REGULAR))) {
echo '重复';
} else {
echo '不重复';
}
存在str_split,array_slice,array_splice,但是不存在array_split
array_slice和array_splice区别
都可以用于对数组取出一小段切片。不在于:array_slice原数组不受任何影响,但是array_aplice原数组会真的被切去一部分,在切去部分前面插入补足的部分。
$input = array("a", "b", "c", "d", "e");
$output = array_slice($input, 2); // returns "c", "d", and "e"
$output = array_slice($input, -2, 1); // returns "d"
$output = array_slice($input, 0, 3); // returns "a", "b", and "c"
$output = array_slice($input, 2, -1); // array(0 => 'c', 1 => 'd');
$output = array_slice($input, 2, -1, true); // array(2 => 'c', 1 => 'd');
$input = array("red", "green", "blue", "yellow");
$output = array_splice($input, 2);
var_dump($input, $output);echo '<hr>';
// $input变为 array("red", "green")
// $output变为 array("blue", "yellow")
$input = array("red", "green", "blue", "yellow");
$output = array_splice($input, 1, -1);
var_dump($input, $output);echo '<hr>';
// $input变为 array("red", "yellow")
// $output变为 array("green", "blue")
$input = array("red", "green", "blue", "yellow");
$output = array_splice($input, 1, count($input), "orange");
var_dump($input, $output);echo '<hr>';
// $input变为 array("red", "orange")
// $output变为 array("green", "blue", "yellow")
$input = array("red", "green", "blue", "yellow");
$output = array_splice($input, -1, 1, array("black", "maroon"));
var_dump($input, $output);echo '<hr>';
// $input为 array("red", "green", "blue", "black", "maroon")
// $output变为 array("yellow")
$input = array("red", "green", "blue", "yellow");
$output = array_splice($input, 3, 0, "purple");
var_dump($input, $output);echo '<hr>';
// $input为 array("red", "green", "blue", "purple", "yellow");
// $output变为 array()
chr与ord的区别
chr():ASCII码转字符串,//$str1=chr(88);返回值为X
ord():字符串转ASCII码,//$str2=ord('S');返回值为83
str_split,explode与implode区别,extract与compact区别
数组和字符串:str_split,explode-拆,implode-合 。str_split无分隔的字符串拆分成数组,explode有分隔的字符串拆分成数组
数组和变量:extract拆,compact-合
$arr = [
'zs' => '章三',
'ls' => '李四',
];
$result = extract($arr);
echo $zs;echo '<hr>';echo $ls;echo '<hr>';//$zs='章三',$ls='李四'
$a = 'php是最好的语言';
$b = 'java能改变世界';
$result = compact('a','b');
var_dump($result);die;
// 结果=array(
// 'a' => string 'php是最好的语言'
// 'b' => string 'java能改变世界'
// )
ucfirst,lcfirst,ucwords,lcwords,strtoUpper,strtoLower区别
ucfirst() - 把字符串中的首字符转换为大写
lcfirst() - 把字符串中的首字符转换为小写
ucwords() - 把字符串中每个单词的首字符转换为大写
lcwords() - 把字符串中每个单词的首字符转换为小写
strtoupper() - 把字符串转换为大写
strtolower() - 把字符串转换为小写
数组开头元素的插入array_unshift与移除array_shift
数组末尾元素的插入array_push与移除array_pop
$arr=array('a'=>'11','b'=>'22','c'=>'33');
$res=array_unshift($arr,'333');//$res=个数,$arr=插入后的数组。
echo $res;echo '<br>';var_dump($arr);echo '<hr>';//$res=4,$arr=array(0=>'333',a'=>'11','b'=>'22','c'=>'33');
$arr=array('a'=>'11','b'=>'22','c'=>'33');
$res=array_shift($arr);//$res=被删除的数,$arr=删除后的数组
echo $res;echo '<br>';var_dump($arr);echo '<hr>';//$res=11,$arr=array('b'=>'22','c'=>'33');
$arr=array('a'=>'11','b'=>'22','c'=>'33');
$res=array_push($arr,'tom');//$res=个数,$arr=插入后的数组。
echo $res;echo '<br>';var_dump($arr);echo '<hr>';//$res=4,$arr=array(a'=>'11','b'=>'22','c'=>'33',0=>'tom');
$arr=array('a'=>'11','b'=>'22','c'=>'33');
$res=array_pop($arr);//$res=被删除的数,$arr=删除后的数组
echo $res;echo '<br>';var_dump($arr);echo '<hr>';//$res=33,$arr=array(a'=>'11','b'=>'22');
http_build_query 与 parse_url+parse_str
http_build_query 数组转字符串
parse_url+parse_str 字符串转数组
$origin = ['a' => 1, 'b' => 2, 'c' => 3];
$output = http_build_query($origin);
echo $output;//a=1&b=2&c=3
$url_name='http://www.domain.com/mytest.php?uid=5&pages=2&category=3';
$urlarr=parse_url($url_name);
var_dump($urlarr);echo '<hr>';
// array (size=4)
// 'scheme' => string 'http' (length=4)
// 'host' => string 'www.domain.com' (length=14)
// 'path' => string '/mytest.php' (length=11)
// 'query' => string 'uid=5&pages=2&category=3' (length=24)
parse_str($urlarr['query']);
echo $category;echo '<hr>';//3
parse_str($urlarr['query'], $outArr);
var_dump($outArr);echo '<hr>';
// array (size=3)
// 'uid' => string '5' (length=1)
// 'pages' => string '2' (length=1)
// 'category' => string '3' (length=1)
//综上:想要获取url里的字段category:
parse_str(parse_url($url_name)['query']);echo $category;die;//3
5.拆分,合并,分解,接合数组
截取字符串substr 与 替换字符串substr_repalce,str_replace
substr('abdcf', 1, 2);//输出 bd
substr_replace('abcdef', '###', 1, 2);//输出 a###def
str_replace("world", "earth", "Hello world!");//输出 Hello earth!
截取数组array_slice 与 替换数组array_splice
array_slice($arr,1[,2]);//在$arr中,从第二个开始取[,返回俩个值]【返回新数组(对原数组无影响),键值保留】
array_splice($arr,1[,2,"aaa","bb"]);//删除或替换,从$arr第二个开始取,删除或替换2个值【返回值为新数组,拆掉原数组】
分割array_chunk与填充array_pad
array_chunk($arr,2)//分割数组,把$arr按照【2个为一组】均等分割【返回一个二维数组】
array_pad($arr, 5, 'a'); //用指定个数的指定元素填充数组,若$a=['c','z']; 结果=['c','z','a','a','a']
字符串反转strrev 与 数组反转array_reserve,array_flip
array_reserve是键名的反转,array_flip是键名和键值的反转
strrev('abcdf');//fdcba
array_reverse(['a'=>'aaa','b'=>'bbb']);//['b'=>'bbb','a'=>'aaa']
array_flip(['a'=>'aaa','b'=>'bbb']);//['aaa'=>'a','bbb'=>'b']
字符串分割str_split,chunk_split 与 数组分割array_chunk
字符串分割str_split是分割成字符数组,chunk_split是按照分隔符分隔生成新字符串
str_split('abcdef');//['a','b','c','d','e','f']
chunk_split('abcdef',2,',');//'ab,cd,ef,'
array_chunk(['a','b','c','d','e','f'],3);//[['a','b','c'],['d','e','f']]
//面试题:写一个函数,将一个字符串(如:1234567890),转换成(如1,234,567,890)每3位用逗号隔开的形式。
function str($str){
//先反转字符串
$new_str=strrev($str);
//在用chunk_split函数将字符串用“ , ” 分割成小块
$new_str= chunk_split($new_str,3,',');
//去掉右边的逗号,返回出去
return strrev(rtrim($new_str,','));
}
并集array+array,array_merge,array_combine的区别
array_combine($arr1,$arr2);//数组$arr1为KEY,$arr2为VALUES结合形成新索引数组【返回索引数组】
array+array,array_merge的区别
1)键名为数字时,array_merge()不会覆盖掉原来的值,但+合并数组则会把最先出现的值作为最终结果返回,而把后面的数组拥有相同键名的那些值“抛弃”掉(不是覆盖)
2)键名为字符时,+仍然把最先出现的值作为最终结果返回,而把后面的数组拥有相同键名的那些值“抛弃”掉,但array_merge()此时会覆盖掉前面相同键名的值
差集array_diff与交集array_intersect
array_diff($arr1,$arr2)//返回两数组的差集,返回的值为第一个数组的值,键值不变
array_intersect($arr1,$arr2)//返回两个数组的交集,键值不变
6.数组的数据结构【2.无返回值,传值引用,就直接对原数组进行了修改】
1.array_shift($arr)//从开头,删除数组第一个元素
2.array_unshift($arr,"one","two")//从开头,添加元素
3.array_pop($arr)//从结尾,删除数组最后一个元素
4.array_push($arr,"aaa");//从结尾,添加元素
6.current($arr)//返回数组中的当前单元 比如是关联数组是不知道下标,可以输出当前数组的办法解决
7.key($arr)//返回当前指针指向元素的键值
8.next($arr)//当前指针下移
9.pre($arr)//当前指针上移
10.end($arr)//指针指到最后
11.reset($arr)//指针回归到开头
12.unset($arr)//销毁此数组
7.其他
1.array_rand($arr,2);//随机返回两个$arr数组当中的key【返回值为值或者数组】
2.shuffle($arr)//随机的重组$arr,顺序变乱【返回新数组,保留键值】
3.array_sum($arr);//返回$arr的value的和【返回一个值】
4.range(0,10,2,)//快速创建0,10的数组,间隔为2,所以有5个值【返回新索引数组】
5.http_build_query($arr)//把关联数组转换成一个经过urlencode加密的URL eg:array["a"=>2];=>URL:a=2&
例:$c="http://test.www.com?".http_build_query(array("name"=>"zs","pwd"=>"123"));
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
字符串函数
返回bool
1.isset($a)//当$a=NULL 或不存在,返回false,反之为true
2.empty($a)//当$a=NULL/''/array()/0/'0'/不存在 时 返回true,反之为false
返回值为自字符
1.substr(字符串,开始地方,[返回字符串的长度]);// 截取字符串的一部分,第一个字符位置为0
2.substr_replace($str,"aaa",start[,length]);在$str上操作,从第start个开始,把【后边】的字符[全/或length个]替换
3.sub_count($str,"is"[,5,10]);//[ 从第五个字符开始,搜索长度为10,]搜索is在$str中出现的次数,【返回次数】
4.strstr($email,"@"[,true]) //从头开始搜索,无true返回@后边字符,有true返回@前边的字符[strrchr对比]
5.strrchr($email,"@")//从结尾开始搜索,返回@后的所有字符
6.str_replace(被替换词,替换词,被搜索字符串,[统计替换次数$num]) 前两个参数也可为数组,两个数组元素个数相同
7.str_repeat($str,num);//重复$str字符串 num次,
返回值为数字类的
1.strpos($str,"@");//返回@【第一次出现的位置】
2.strrpos($str,"@");//返回@【最后一次出现的位置】
3.str_word_count($str[,0/1/2]);
//返回$str中单词的数量[0指返回次数,默认值/1指以数组形式返回单词值/2指返回关联数组,k为单词首字母下标,v单词值]
4.strcmp($str1,$str2);//按ASCII码比较 str1>str2 则返回1 相等返回0 <返回-1 strcasecmp不区分大小写的比较
5.strnatcmp($str1,$str2);//按自然数的排序比较,上边的比较10<2;本函数比较10>2,按自然数大小来的
strcasecmp($str1,$str2);strnatcasecmp//以上4个函数,$str1,$str2比较,【返回值:相等0,小于-1,大于1】
6. number_format(10000[,2]); //==》10,000.00 把第一个参数格式化,保留2位小数
7. strlen($string);成功则返回字符串 $string 的长度
8. mb_strlen($string,'utf8');//获取字符串$string长度,多字节的字符被计为 1。
文本处理类
1.strtoupper($str)//字母全转为大写【返回全大写字符串】
2.strtolower()//字母全转为小写【返回全小写字符串】
3.strtotime('2015-10-10 10:10:10');//指定时间转换为时间戳【返回时间戳】
4.str_pad($str,length,[---,STR_PAD_BOTH]); //在$str的两边填补“---“,注意,length若小于$str长度,不填补
5.trim($str[,"a",STR_PAD_BOTH])// 去除两边/左/右的空白或"a",默认是空白,或自定义字符
6.floatval("123.45aa")//=》获取变量的浮点值【123.45】
7.ucfirst()//整个$str首字母大写
8.ucword()//$str每个单词首字母大写
HTML类处理
1.htmlspecialchars($str)//函数把【预定义字符】转换为【 HTML 实体】,&转换成&
htmlspecialchars_decode($str);//把【HTML实体】转换成【预定义字符】,&转换成&
2.htmlentities($str);,函数把【预定义字符】转换为【 HTML 实体】,&转换成&,有乱码问题,注意第二第三个参数,若编码不正确,会在实体化时把信息丢失
html_entity_decode($str)把【HTML实体】转换成【预定义字符】,&转换成&, > 转成 <
3.addslashes($html); //添加转义字符“/”
stripslashes($html); //删除转义字符“/”
4.strip_tags($html); //去除HTML标签
5.nl2br($str) //在$str中的换行/n前插入<br>,因为\n在源码可以换行,但是在浏览器窗口不行,有这个就可以
6.iconv( from_charset ; to_charset,$str); //转化字符格式 $file_name = iconv("gb2312","utf-8",$file_name);
<?php
strip_tags(string,allow)
// strip_tags:删除字符串中的html,xml,php标签
// string:检查的字符串
// allow:规定允许不会被删除的标签
// 注意:1、 连同html注释也删掉 2、它不检查标签的完整性
//例1:只保留<a>一个标签
$str = "<p>我来自<b><a href='http://php.cn'>PHP中文网</a></b></p>";
echo strip_tags($str,"<a>");
//输出:我来自<a href='http://www.php.cn'>PHP中文网</a>
//例2:要保留<p>与<b>…多个标签,只需要将多个标签用空格分隔后写到strip_tags的第二个参数中
$str = "<p>我来自<b><a href='http://php.cn'>PHP中文网</a></b></p>";
echo strip_tags($str, "<p> <b>");
//输出:<p>我来自<b>PHP中文网</b></p>
//例3:
$name="<p>string</p>
string-1<string
<b>hello</b>
<p>string-2</p>";
$tags=strip_tags($name,'<p>');
echo $tags;
// 本想输出:
// string
// string-2
// 但是却输出:
// string
// string-1
// 仔细观察上面代码中的变量$name,发现$name中的字符串有一个标签是不完整的,这是因为strip_tags()函数无法实际验证 HTML标签的完整性,如果HTML标签不完整,会导致更多的数据被删除。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
正则函数[原则,能用字符串函数解决不用正则,速度问题]
字符串的匹配查找
1.preg_match($pattern,$subject,$arr);//按正则$pattern处理$subject,第一次匹配结果返回到数组中【函数的返回值为匹配次数】
2.preg_match_all($pattern,$subject,$arr)//按正则$pattern处理$subject,全部匹配结果返回到数组中【函数的返回值为匹配次数】
3.strstr($str,"@"[,true]);
4.strpos,strrpos,substr($str,position)//联合使用
字符串的替换
1.preg_replace($patten,$replace,$str);//【强大的字符串处理函数】
在$str中,把$parrern匹配的值替换成$replcae【返回值为处理后的字符串】
2.str_replace($find,$replace,$str);//把$str中的$find换成$replace
字符串的分割和链接
1.preg_split($pattern,$str);通过一个正则表达式分隔字符串【返回值为数组】
举例:$keywords = preg_split("/[\s,]+/", "hypertext language, programming");
结果Array([0] => hypertext,[1] => language[2] => programming)
2.explode(",",$str[,$limit_num]);//把$str按照","分割成一个数组[可选参数为返回数组的元素个数]【返回一个分割后的数组】
3.impolde("+",$arr);//把$arr里的元素按照“+”链接成一个字符串
preg_match("/php/i", "PHP is good.Learn php is perfect.I love Php",$result1);//"i"标记表示大小写不敏感
var_dump($result1);//array(1) { [0]=> string(3) "PHP" }
preg_match_all("/php/i", "PHP is good.Learn php is perfect.I love Php",$result2);
var_dump($result2);//array(1) { [0]=> array(3) { [0]=> string(3) "PHP" [1]=> string(3) "php" [2]=> string(3) "Php" } }
$str = 'runo o b';
$str2 = preg_replace('/\s+/', '', $str);
echo $str2;echo "<hr>";// 将会改变为'runoob'
$str="hash jdm happy";
$str2=str_replace([" "," ","\t","\n","\r"],"",$str);//去除字符串的空格换行等
echo $str2;//hashjdmhappy
常用正则匹配详见:常用正则表达式_wuhuagu_wuhuaguo的博客-CSDN博客
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
文件处理函数
[$file=c://php/index.php]
1.file_exists($file)//文件是否存在,【true/false】
2.filesize($file) //返回文件的大小【大小字节/出错false】
3.is_readable($file)//是否可读【返回bool】
4.is_writeable($file)//是否可写【返回bool】
5.is_executable($file)//是否可执行【返回bool】
6.filectime($file)//文件创建时间【时间戳】
7.filemtime($file)//文件修改时间【时间戳】
8.fileatime($file)//文件访问时间【时间戳】
9.stat($file)//返回文件的大部分信息【文件信息数组】
10.fopen($fileName,"模式字符r,w,x")//打开一个文件,【返回值为资源型$handle】
11.fclose($handle) //关闭打开的文件【返回BOOL】
12.fwrite($handle,"$data")//把$data写入$handle文件,先清空后写入,【成功返回$handle,失败返回false】
13.file_put_contents($filename,$data);//它是上边三个合起来的效果
14.file_get_contents($filename)//读取文件里的信息【返回字符串】
15.flock($handle,$operation) //用$operation锁定文件$handle,$operation取值有4种:
LOCK_SH(PHP 4.0.1 以前的版本设置为 1):取得共享锁定(读取的程序)
LOCK_EX(PHP 4.0.1 以前的版本中设置为 2):取得独占锁定(写入的程序)
LOCK_UN(PHP 4.0.1 以前的版本中设置为 3):释放锁定(无论共享或独占)
LOCK_NB(PHP 4.0.1 以前的版本中设置为 4):不让 flock() 在锁定时堵塞
16.copy($file1,$file2);//文件的复制。赋值$file1,形成$file2【返回BOOL】
17.unlink($file);//删除$file文件【返回BOOL】
18.rename($file1,$file_new_name);//重命名【返回BOOL】
19.文件的上传---注意:html:form: method="post" ;enctype="multipart/form-data"
is_upload_file($_FILES['file']['tmp_name']) //检查是否合法
move_upload_file($_FILES['file']['tmp_name'],$url); //上传合法文件到$url
20.文件的下载
header('content-disposition:attachment;filename='.basename($filename));//表示附件方式下载
header('content-length:'.filesize($filename));
readfile($filename);
//以下完成多人对同一文件的写入---fopen,flock,fwrite,fclose
$file = fopen("test.txt","w+”);
//由于 flock() 需要一个文件指针, 因此可能不得不用一个特殊的锁定文件来保护打算通过写模式打开的文件的访问(在 fopen() 函数中加入 "w" 或 "w+")
if (flock($file,LOCK_EX)){// 排它性的锁定
fwrite($file,"Write something");
flock($file,LOCK_UN);//释放锁
}else{
echo "Error locking file!";
}
fclose($file);
************************************************************************************************************************************************
目录处理函数
1.basename($file) //返回文件名,index.php
2.dirname($file) //返回文件的路径,c://php/
3.pathinfo($file) //返回该文件路径的所有信息 ["dirname"目录名] ["basename"文件名] ["extension"文件后缀]
4.filesize($file) 统计大小
5.mkdir("dir_name");//建立一个空的目录
6.copy($org,$to) //复制
7.rmdir("dir_name");//删除一个空的目录
8.unlink("file_name")//删除一个文件,当删除目录是,必须删除该目录下的文件
9.opendir($file) //打开一个目录,参数为目录名或目录路径【返回资源型的目录句柄$dir_handle,无权限返false】
10.readdir($dir_handle) //读取目录,参数为目录句柄,while,返回当前指向对象的名字,目录指针后移【返回filename,没有是返false】
11.is_dir($dir) //判断是否是目录
12.closedir($dir_handle) //关闭打开的目录
13.rewinddir($dir_handle) //倒回目录句柄,将目录指针重置到目录开始
例1:
<?php
//返回一个目录下的所有文件和子文件夹
//opendir readdir is_dir closedir
function xf_scandir($dir)
{
$files = array();
if( $handle=opendir($dir) ){ //$handle=Resource id #3
while( ($file = readdir($handle)) != false ){ //echo $file;echo "<hr>"; //$file分别是 . .. a.php b.php c
if( $file != ".." && $file != "." ){
if( is_dir($dir . "/" . $file) ){ //文件夹c
$files[$file] = xf_scandir($dir . "/" . $file);
}else{ //文件a.php,b.php
$files[] = $file; //var_dump($file);echo "<hr>";//分别是 a.php b.php
}
}
}
closedir($handle);
return $files;
}
}
$re=xf_scandir('D:\testscandir');
var_dump($re);
/*
array (size=3)
0 => string 'a.php' (length=5)
1 => string 'b.php' (length=5)
'c' =>
array (size=2)
0 => string 'c1.txt' (length=6)
1 => string 'c2.doc' (length=6)
*/
例2:
//写出一个能创建多级目录的PHP函数(新浪网技术部)---isdir,mkdir
function create_dir($path,$mode = 0777) {//$path要创建的多级目录,$mode创建目录的模式,在windows下可忽略
if (is_dir($path)) {
//如果目录已经存在,则不创建
echo "该目录已经存在";
} else {
# 不存在,创建
if (mkdir($path,$mode,true)) {
echo "创建目录成功";
} else {
echo "创建目录失败";
}
}
}
例3:
// 遍历文件夹$path,生成TABLE---opendir,readdir,filetype,iconv_change,filesize,filectime
function menu_list($root_path){
$num=0;//存储条数
$dir_handle=opendir($root_path);
echo "<table border=1 cellspacing=5 cellpadding=10 align='center'>";
echo "<caption>{$root_path}文件夹</caption>";
echo "<tr>";
echo "<td>文件名</td><td>类型</td><td>大小</td><td>创建时间</td>";
echo "</tr>";
while($file_name=readdir($dir_handle)){
if($file_name =="." || $file_name=="..") continue;
$cur_path=$root_path."/".$file_name;
$bgcolor=$num++%2==0?"#FFFFFF":"#CCCCCC";
$cate=filetype($cur_path)=="dir"?"目录":"文件";
echo "<tr color={$bgcolor}>";
$file_name = iconv_change($file_name);
echo "<td>{$file_name}</td>";
echo "<td>{$cate}</td>";
echo "<td>".filesize($cur_path)."</td>";
echo "<td>".date("Y-m-d H:i:s",filectime($cur_path))."</td>";
echo "</tr>";
}
echo "<tr><td colspan=4 align=center>文件总数为:{$num}个</td></tr>";
echo "</table>";
}
例4:
//删除文件夹[也可以删除文件]
function del_dir($root_path){ //文件夹的路径
// echo file_exists($root_path)."--<br>";
if(!file_exists($root_path))exit('文件不存在');
if(is_file($root_path))unlink($root_path);exit;
$dir_handle=opendir($root_path);//打开此文件夹
while($cur_name=readdir($dir_handle)){//遍历文件夹
if($cur_name =="." || $cur_name=="..")continue;//删除前两个默认的
$cur_path=$root_path."/".$cur_name;
if(is_file($cur_path)){
//是文件,执行删除文件
del_file($cur_path);
}else{
//是文件夹,删除文件夹,递归
del_dir($cur_path);
}
}
closedir($dir_handle);
rmdir($root_path);
}
//删除文件操作
function del_file($file_path){
return unlink($file_path);
}
例5:
//统计目录大小【得自定义函数,不自带】
echo transform_unit(dirSize($path),"KB");
/**
* 统计文件夹大小[也可以统计文件]
* @param 文件夹的目录路径
* @return 返回该目录的大小
*/
function dirSize($dir){
$dir_size=0;
if(!file_exists($dir))exit("文件不存在");
if(is_file($dir))return filesize($dir);//如果是文件,返回文件大小
$handle=opendir($dir);
while($cur_name=readdir($handle)){
if($cur_name=="." || $cur_name=="..")continue;
$cur_path=$dir."/".$cur_name;//获取当前文件的路径
if(is_file($dir)){
$dir_size+=filesize($cur_path);//如果是文件,累加文件大小到file_size
}
if(is_dir($dir)){
$dir_size +=dirSize($cur_path);//如果是文件夹,累加文件夹大小到file_size
}
}
return $dir_size;
}
/**
* 转换单位大小
* @param,data 以B为单位的字节大小
* @param,unit 转换后的单位
* @return 转换后的数字及单位,字符串格式
*/
function transform_unit($data,$unit="MB"){
$unit=strtoupper($unit);
switch ($unit) {
case 'B':$data=$data/pow(1024, 0);break;
case 'KB':$data=$data/pow(1024, 1);break;
case 'MB':$data=$data/pow(1024, 2)break;
case 'TB':$data=$data/pow(1024, 4);
}
return round($data,2).$unit;
}
例6:
//复制一个目录及文件【得自定义函数,不自带】
copyDir($path,"test");
/**
* 复制文件夹,生成另一个文件夹
* @param $fromDir ,被复制的源文件夹
* @param $toDir,生成的文件夹名字
*/
function copyDir($fromDir,$toDir){
if(is_file($toDir))exit("目标地址不是文件夹");//不是文件夹返回提示
if(!file_exists($toDir))mkdir($toDir);//没有创建目标文件夹,创建
$handle=opendir($fromDir);//打开文件夹
while($cur_name=readdir($handle)){
$cur_path=$fromDir."/".$cur_name;//进入一层文件夹后,当前文件的路径
$cur_to_path=$toDir."/".$cur_name;//要复制的形成的路径
if($cur_name=="." || $cur_name=="..")continue;
if(is_file($cur_path)){
copy($cur_path,$cur_to_path);//若是文件复制当前文件到目的文件夹
}
if(is_dir($cur_path)){
copyDir($cur_path,$cur_to_path);//若是文件夹,复制该文件夹
}
}
closedir($handle);//关闭文件夹
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL函数
1.mysql_connect('localhost',"root","root");//连接诶数据库
2.mysql_select_db('data',$conn);//选择数据库名
3.mysql_query('set names utf8');//设置编码
4.mysql_affect_row();//返回索引数组
5.mysql_affect_assoc();//返回关联数组
6.mysql_affect_array();//试返回值为关联/索引数组
7.mysql_num_rows();//返回上一次select的查询语句条数
8.mysql_affected_rows();//返回上一次insert,update,delete的数据条数
9.mysql_close();//关闭数据库
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
数学函数
1.ceil()//向上取整
2.floor()//向下取整
3.round();//四舍五入
4.abs();//取绝对值
5.rand(10,100)//随机取值
6.mt_rand(10,100)//随机取值,算法不同,速度更快
7.fmod()//返回除法浮点形余数
8.max(int/$arr)//取最大值
9.min(int/$arr)//取最小值
10.pow(1024,2)//返回1021的2次幂
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
时间函数
1.date_default_timezone_set()('PRC');//设置时区为中国
date.timezone ="PRC";//PHP.INI
2.time();//默认获取当前时间,【返回时间戳格式】
3.micritime();//获取当前时间【返回毫秒的时间戳】
4.mktime(H,i,s,m,d,Y)//指定时间转为时间戳,参数为空的时候作用与time()相同【返回时间戳格式】
5.strtotime('2015-10-10 10:10:10');//指定时间转换为时间戳【返回时间戳】
6.date("Y-m-d H:i:s",time());//转换时间戳为日期格式【返回目标格式的字符串】
7.getdate()//获取当前时间,【返回一个数组,参数年,月,日等都有】
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
URL处理函数
1.urlencode($url)//对该URL进行编码;原因:防止乱码,解决空格的呢个字符不能传递问题,form也是此编码格式传递
2.urldecode($url)//对该URL进行解码
3.parse_url($url)//返回该URL的所有信息,[scheme协议][host域名] [path路径][query参数] 【返回含信息的数组】
pathinfo($url)//["dirname"目录名] ["basename"文件名] ["extension"文件后缀]【返回含信息的数组,下标不同】
4.get_meta_tags($url)//获取该页面的所有META标签【返回关联数组】
//写一个函数,尽可能高效的,从一个标准url里取出文件的扩展名,例如:http://www.sina.com.cn/abc/de/fg.php?id=1需要取出php或.php(新浪)
// 方案一
function getExt1($url){
$arr = parse_url($url);
//Array ( [scheme] => http [host] => www.sina.com.cn [path] => /abc/de/fg.php [query] => id=1 )
$file = basename($arr['path']);
$ext = explode('.', $file);
return $ext[count($ext)-1];
}
// 方案二
function getExt2($url){
$url = basename($url);
$pos1 = strpos($url,'.');
$pos2 = strpos($url,'?');
if (strstr($url,'?')) {
return substr($url,$pos1+1,$pos2-$pos1-1);
} else {
return substr($url,$pos1);
}
}
$path = "http://www.sina.com.cn/abc/de/fg.php?id=1";
echo getExt1($path);
echo "<br />";
echo getExt2($path);