php函数搜集
数组:
注意:array_walk_recursive array_merge_recursive array_replace_recursive 支持多维数组,其他都是一维数组的操作?
删除及过滤
array_filter ($arr ,$callback [, int $flag = 0 ]] );//数组过滤删除回调函数中返回fasle的数组
$arr = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4]; #ARRAY_FILTER_USE_KEY 只接受键 array_filter($arr, function($key) { return $key == 'b'; #当为true时则保留 }, ARRAY_FILTER_USE_KEY); #['b'=>2] #ARRAY_FILTER_USE_BOTH 接受键值 array_filter($arr, function($v, $key) { return $key == 'b' || $v == 4; }, ARRAY_FILTER_USE_BOTH); #['b'=>2,'d'=>4]; #只有一个参数时会将数组的值转为boolean 为true 则保留,否则删除
array_splice
(
$arr
,$start_index_int,$remove_length);//移除索引数组中指定位置及之后的length个元素,返回被移除的元素数组
$arr=[1,2,3,4,5]; array_splice($arr,0,2);//返回[1,2] 此时$arr=[3,4,5]
unset()函数删除的话,数组的索引值没有变化。
$arr=[1,2,3,4]; $unset($arr[1]);//arr=[0=>1,2=>3,3=>4]
array_pop($arr);删除最后一个元素(出栈)
$stack = array("orange", "banana", "apple", "raspberry"); $fruit = array_pop($stack);
array_shift ( $arr
);删除第一个元素
$arr= array("orange", "banana", "apple", "raspberry"); $fruit = array_shift($arr);//[0=>'banana',1=>'apple',2=>'raspberry'];
数组元素追加
array_splice
(
$arr
,$start_index_int,$remove_length,$replace_arr);//$start_index_int,$remove_length组合不再$arr的范围即不能删除和替换时就插入
$arr[]='value';
array_push($arr,$value1,$value2,...);//尾部插入新单元(入栈) 就新增单元而言$arr[]=value 效率更高
注意:array_splice不保留键名每次都会截断并重新生成索引键
array_unshift($arr,value1,$value2,$valueN...) 数组的开头插入value
随机:
shuffle 打乱数组
array_rand($arr,5) 重数组总共随机抽取5个一维元素
键值互换:
array_flip($arr)
合并
拆分
array_chunk($arr,$size,false为不保留键) 按照每个$size个数拆分数组
截取
array_slice ($arr ,$start_index [,\$length = NULL [,\$preserve_keys = false ]] );//length 为null 截取 start_index ~数组末尾的
$input = array("a", "b", "c", "d", "e"); #第二个参数为父则从数组末尾开始,第三个参数为负则截取在末尾至(-参数)位置之前的 第三参数为true则不重置数字索引 array_slice($input, 2); //[ "c", "d", "e"] array_slice($input, -2, 1); // ["d"] array_slice($input, 0, 3); //["a","b","c"] array_slice($input, 2, -1); //[0=>'c',1=>'d'] array_slice($input, 2, -1, true);//[2=>'c',3=>'d']
数组元素替换
array_splice
(
$arr
,$start_index_int,$remove_length,$replace_arr);//第四个参数存在时不是移除而是修改
array_replace_recursive($arr,$arr1,$arrN);//递归替换$arr独有保持不变,$arr1独有则追加,同时存在则替换(先arr1替换,完事后arrN再替换)即支持多维替换
$arr=['a'=>1,'b'=>2,'c'=>3,4]; $arr1=['a'=>100]; $arrN=['d'=>5]; $ar=array_replace_recursive($arr,$arr1,$arrN); array(5) { ["a"]=> int(100) ["b"]=>int(2) ["c"]=>int(3) [0]=>int(4) ["d"]=>int(5) }
array_replace($arr ,$arr1,$arrN ) (用法同array_replace_recursive)一维 数组替换 不能递归替换
数组元素查找
array_search ($
, search_value
$arr
, false );//一维数组中查找指定元素 返回键名 (只返回匹配的第一个)
array_keys ($arr
, $search_value=null,false
);//返回一维数组元素值相同的所有键名
array_keys ($arr
);//返回一维数组的所有键名
$array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red',4=>"green"); $key = array_search('green', $array); // $key = 2; $keys=array_keys($array,'green');//[2,4]
array_values($arr); 返回数组中所有的值
in_array ($search_value, $arr, FALSE【严格匹配】 ); 检查一维数组里是否存在给定的值
array_key_exists() - 检查数组一维里是否有指定的键名或索引(返回bolean)
求和
array_sum() 返回一维数组所有的值总和
数组去重:
方法1:php自带此功能的函数array_unique($arr)
方法2:$arr = array_flip(array_flip($arr)); //这样便可以删除重复元素。 比上面的要效率;
原理:array_flip()交换数组中的键和值但是php键是唯一的而且数组中可以有相同的值如果交换键和值的话最后一个相同的值或取代前面相同的值进行交换
关联数组变索引数组:
array_values($arr)
php数组差集交集并集
差集:(取独有) 返回arr中有某个值而其他它arr1~arrN无此值或键或键值的结果
array_diff_key 计算差集(系统函数比较键)
array_diff 计算差集(系统函数比较值)
array_diff_assoc 计算差集(系统函数比较键和值)
array_diff_uassoc 计算差集(系统函数比较值,自定义函数比较键)
array_diff_ukey 计算差集(自定义函数比较键)要么全是关联数组要么全是索引数组
array_udiff_assoc 计算差集(系统函数比较键,自定义函数比较值)
array_udiff_uassoc 计算差集(自定义函数比较值和键)
array_udiff 计算差集(自定义函数比较值)
交集(取共同) 返回arr中有某个值且其他它arr1~arrN也有此键或值或键值的结果
array_intersect_key 计算交集(系统函数比较键)
array_intersect 计算交集(系统函数比较值)
array_intersect_assoc 计算交集(系统函数比较键和值)
array_intersect_uassoc 计算交集(系统函数比较键和值)
array_intersect_ukey 计算交集(系统函数比较值,自定义函数比较键)
array_uintersect_assoc 计算交集(系统函数比较键,自定义函数比较值)
array_uintersect_uassoc 计算交集(自定义函数比较值和键)
array_uintersect 计算交集(自定义函数比较值)
并集(取全部)
array_merge($arr1,$arrN);
array_merge_recursive ($array1 ,$arrN); //有相同字符串的key则合并,其余追加(键值相同不覆盖)
数组循环 一般加引用要慢点
foreach 与array_walk相比 array_walk多出一个函数调用
效率 for≈foreach(无key) >foreach(有key)>foreach(有key+引用)>foreach(无key+引用)>array_walk(函数在外) >array_walk(函数在内) >array_walk(引用) >array_map
foreach是最快的,因为php的array内部元素之间有指针,就是list,直接指向下个元素的内存地址,所以遍历速度很快 for的问题在于,每次都要做一个hash table的查询。 array_walk/array_map 遍历的方式和foreach一样的,慢是慢在回调函数
但是如果在循环里有函数调用array_walk的效率是最高的、
$max = 1000000; $test_arr = range(0, $max); $temp=0; echo "<br>"; echo "<br>"; echo "<br>"; /*for 的方法*/ $t1 = microtime(true); for ($i = 0; $i < $max; $i++) { demo($i); } $t2 = microtime(true); $t = $t2 - $t1; echo "就使用for, 花费: {$t}<br>\n"; /*foreach*/ $t1 = microtime(true); foreach ($test_arr as $key => $value) { demo($value); } $t2 = microtime(true); $t = $t2 - $t1; echo "就使用foreach有key, 花费: {$t}<br>\n"; /*foreach*/ $t1 = microtime(true); foreach ($test_arr as $value) { demo($value); } $t2 = microtime(true); $t = $t2 - $t1; echo "就使用foreach无key, 花费: {$t}<br>\n"; /*foreach*/ $t1 = microtime(true); foreach ($test_arr as &$value) { demo($value); } $t2 = microtime(true); $t = $t2 - $t1; echo "就使用foreach无key+引用, 花费: {$t}<br>\n"; /*foreach*/ $t1 = microtime(true); foreach ($test_arr as $key => &$value) { demo($value); } $t2 = microtime(true); $t = $t2 - $t1; echo "就使用foreach有key+引用, 花费: {$t}<br>\n"; /*array_walk*/ $t1 = microtime(true); array_walk($test_arr ,function(&$itemValue,$key){ demo($itemValue); }); $t2 = microtime(true); $t = $t2 - $t1; echo "array_walk+引用, 花费: {$t}<br>\n"; /*array_walk*/ $t1 = microtime(true); array_walk($test_arr ,function($itemValue,$key){ demo($itemValue); }); $t2 = microtime(true); $t = $t2 - $t1; echo "array_walk, 花费: {$t}<br>\n"; /*array_walk*/ $t1 = microtime(true); array_walk($test_arr ,'arrayWalkCallBack'); $t2 = microtime(true); $t = $t2 - $t1; echo "array_walk 函数在外, 花费: {$t}<br>\n"; function demo($num) { $test=new stdClass(); $test->name='dash'; $test->age=28; $test->like='乒乓'; $test->code=$num; return $test; } function arrayWalkCallBack($itemValue,$key){ demo($itemValue); }
array_walk_recursive($arr
, $callback
[, mixed $userdata
= NULL
]) 数组循环之递归的为每个数组元素调用callback
为什么我在点击浏览器的后退按钮后,所有字段的信息都被清空了?
提交表单的页面使用了session_start();该函数会强制当前页面不被缓存,表单提交错误数据时后在返回提交页面表单使内容被清空,要想保留表单的数据怎么办?
第一种方法:使用session_cache_limiter('private, must-revalidate')函数,但是要值得注意的是session_cache_limiter()方法要写在session_start()方法之前才有用;
第二种方法:header('Cache-control: private, must-revalidate');//支持页面回跳;在session_start()方法之后用
__DIR__和dirname(__FILE__);都是获取当前脚本所在目录的__DIR__效率高但是实在php5.3加入的所以用时需要注意