工作中常用的PHP函数,整理出来,以方便后边快速使用轮子。
1、字符串编码转换
/** * 字符串编码转换 * * @param string $str 待处理的字符 * @param string $in_charset 输入编码 * @param string $out_charset 输出编码 * @return string */function str_iconv($str, $in_charset = 'UTF-8', $out_charset = 'GBK'){ $str = mb_convert_encoding($str, $out_charset, $in_charset); return $str;}
2、数组编码转换
/** * 数组编码转换 * * @param array $arr 待处理的数组 * @param string $in_charset 输入编码 * @param string $out_charset 输出编码 * @return array */function arr_iconv($arr, $in_charset = 'UTF-8', $out_charset = 'GBK'){ $arr = eval('return ' . mb_convert_encoding(var_export($arr,true), $out_charset, $in_charset) . ';'); return $arr;}
3、从内容中匹配出图片信息
/** * 从内容中匹配出图片信息(有多少图片信息就匹配出多少) * * @param string $content 内容信息 * @param boolean $b_only_img_url 是否只获取图片地址,默认为true * @return array *
4、获取一个Hash编码
/** * 获取一个Hash编码 * * @param string $str 字符串 * @return string */function make_hash_code($str){ if(empty($str)) return ''; $mdv = md5($str); $mdv1 = substr($mdv,0,16); $mdv2 = substr($mdv,16,16); $crc1 = abs(crc32($mdv1)); $crc2 = abs(crc32($mdv2)); return bcmul($crc1,$crc2);}
5、根据某天返回特定日期
/** * 根据当天的时间,返回此周末的时间 * * @param string $date * @return array $date_arr($Sat,$Sun) */function get_weekend_by_date(){ $year = date("Y"); $month = date("m"); $day = date("d"); $nowday = mktime(0,0,0,$month,$day,$year); $w=(int)date("w",$nowday); if($w==0) { $Sat = mktime(0,0,0,$month,$day - 1,$year); $Sun = mktime(0,0,0,$month,$day + 1,$year); }else{ $t = 6 - $w; $Sat = mktime(0,0,0,$month,$day + $t,$year); $Sun = mktime(0,0,0,$month,$day + $t + 2,$year); } return array("Sat"=>$Sat,"Sun"=>$Sun);}/** * 根据时间英文名称,返回特定时间段戳 * @desc 返回今天,周末,下周,未来,过去,某个时间段对应的时间戳 * @param string $time_type 时间形式(today, weekend, next_week,future_all,history, time_to_time) * @param $search_end_time 当time_type为time_to_time时,需要传入时间戳 * @return array; */function get_timestamp_by_time_type($time_type = "today", $search_end_time = ""){ // 支持的日期格式名称 // $time_type_arr = array('today', 'weekend', 'next_week', 'future_arr', 'history', 'time_to_time'); switch ($time_type) { case "today": //今天 $today = strtotime(date('Y-m-d')); $tomorrow = $today+86400; $querys["start_time"] = $tomorrow; $querys["end_time"] = $today; break; case "weekend": //周末 $arr = mforum_get_weekend_by_date(); $querys["start_time"] = $arr["Sun"]; $querys["end_time"] = $arr["Sat"]; break; case "next_week": //未来7天 $today = strtotime(date('Y-m-d')); $next_week = $today+(86400*7); $tomorrow = $today+86400; $querys["start_time"] = $next_week; $querys["end_time"] = $tomorrow; break; case "future_all": //未来全部 $nowtime=time(); $querys["end_time"] = $nowtime; break; case "history": //历史活动 $nowtime=time(); $querys["end_time"] = "< {$nowtime}"; break; case "time_to_time": //选择时间段 $end_time = strtotime($search_end_time); if(!empty($end_time)) { $day = strtotime(date('Y-m-d',$end_time)); $tomorrow = $day+86400; $querys["start_time"] = $tomorrow; $querys["end_time"] = $day; } break; default: break; } return $querys;}
6、从内容中取出简介
/** * 从内容中取出简介 * * @param string $content 传入的内容 * @param int $length 截取长度 * @param boolean $b_pure 是否过滤所有标签,还是只保留和
* @return string */function make_content_summary($content, $length = 200, $b_pure = false, $b_filter_word = true){ if(empty($content)) return ''; $content = str_replace(array(' ', ''', '"'), array(' ', "'", '"'), $content); $b_pure == true && $content = strip_tags($content, ''); $b_pure == false && $content = strip_tags($content); $mixed_arr = array( '/[\r\n]*?/' => '', //并为一行 '/.*<\/span>/iU' => '', '/(rel="item"\/>)
[^<]*?
/iU' => '$1', '/&[a-z]+;/' => '', '/<([a-z]+)[^>]*?>/i' => '<\1>', '/(<\/?br\s*?\\/?\s*?>){2,}/i' => '\1', '/(\s*){2,}/' => '', '/<[^>]*?$/ms' => '', '/\s+/' => '', ); $pattern = array_keys($mixed_arr); $replacement = array_values($mixed_arr); $content = preg_replace($pattern, $replacement, $content); $content = mb_substr($content, 0, $length, 'GBK'); $content = trim($content); $content = preg_replace('~<[\w]+$~', '', $content); if(trim(strip_tags($content)) == '') $content = ''; //空标签返回空 return $content;}
7、根据过期时间判断剩余的天数
/** * 根据过期时间判断剩余的天数 * @desc 如果为0,则表示活动已经结束 * @param $expire_time 时间戳 * @return float|int */function check_remaining_days($expire_time){ // 获取当前时间 $cur_time = time(); $expire_time = (int)$expire_time; $diff_time = ($expire_time - $cur_time); $remaining_days_count = 0; if($diff_time > 0) { // 计算剩余的天数 $remaining_days_count = ceil($diff_time / (24 * 3600)); } return $remaining_days_count;}
8、切割字符串
/** * 切割字符串 * * @param string $str 需要切割的字符串 * @param int $lenght 长度 * @param string $tail 超过长度后面追加字符 * @param string $encrypt 编码,默认GBK * @return string */function cut_str($str, $lenght, $tail='...', $encrypt='GBK'){ if(mb_strlen($str,$encrypt) > $lenght) { return mb_substr($str, 0, $lenght, 'GBK').$tail; } else { return $str; }}
9、php页面返回前端页面js信息
/** * 错误信息提示,并退出程序 * @param string $msg 错误信息 */if (!function_exists("js_pop_msg_parent")){ function js_pop_msg_parent($msg,$b_reload=false,$url=NULL) { echo ""; exit; }}// 举例:index.php 0 ? "操作成功" : "操作失败!";$b_reload = $user_id > 0 ? true : false;// 返回信息js_pop_msg_parent($msg,$b_reload);
10、php页面header跳转
//1.立即跳转header("location:http://baidu.com/");exit();// 2.几秒后再跳转 header("refresh:3;url=http://baidu.com/"); print('请求的内容不存在...三秒后自动跳转。'); exit();
11、数组与字符串相互转换
// 将数组转为字符串 function a2s($arr) { $str = ""; foreach ($arr as $key => $value) { if (is_array($value)) { foreach ($value as $value2) { $str .= urlencode($key) . "[]=" . urlencode($value2) . "&"; } } else { $str .= urlencode($key) . "=" . urlencode($value) . "&"; } } return $str; }// 将字符串转为数组function s2a($str) { $arr = array(); parse_str($str, $arr); return $arr; }// 完整示例$arr = array('usr_id' => 2, 'nickname' => '周荣发', "uids" => array(6,234,34,67,7888,2355));$ret = a2s($arr);dump($ret );$str = "usr_id=2&nickname=%D6%DC%C8%D9%B7%A2&uids[]=6&uids[]=234&uids[]=34&uids[]=67&uids[]=7888&uids[]=2355&";$new_arr = s2a($str);dump($new_arr);
12、生成指定长度随机数
function generate_code($length = 6) { return rand(pow(10,($length-1)), pow(10,$length)-1);}
13、判断手机号是否正确
/** * 判断手机号码是否正确 * @param $phone 手机号 * @param $zone_num 区号 */ function check_phone($phone, $zone_num = 86) { if(!is_numeric($phone) || !is_numeric($zone_num)) return false; if($zone_num === 86) { // 国内号码规则 return preg_match('/^13[\d]{9}$|^14[5,7]{1}\d{8}$|^15[^4]{1}\d{8}$|^17[0,6,7,8]{1}\d{8}$|^18[\d]{9}$/', $phone) ? true : false; } else { // 国际号码,这里只做一个简单的匹配 return preg_match('/^[1-9]{1}\d{7,15}$/', $phone) ? true : false; } }
13、获取对象的公共属性
publics($User);$ret = get_object_vars($User);print_r($data);
14、页面跳转
if(!function_exists('redirect')){ // 网页跳转 function redirect($url) { header("Location:{$url}"); exit(); }}/** * 页面信息跳转 * * @param string $url 跳转地址 * @param string $msg 消息内容 * @return void */function page_msg_location($url, $alert = null, $b_parent = false){ // 如果提示信息出现乱码,需要加上编码信息 echo ''; echo ' '; echo ''; exit();}
15、获取某月的第一天和最后一天
// php获取当月天数及当月第一天及最后一天、上月第一天及最后一天实现方法1.获取上个月第一天及最后一天. echo date('Y-m-01', strtotime('-1 month')); echo ""; echo date('Y-m-t', strtotime('-1 month')); echo "";2.获取当月第一天及最后一天. $BeginDate=date('Y-m-01', strtotime(date("Y-m-d"))); echo $BeginDate; echo ""; echo date('Y-m-d', strtotime("$BeginDate +1 month -1 day")); echo "";3.获取当天年份、月份、日及天数. echo " 本月共有:".date("t")."天"; echo " 当前年份".date('Y'); echo " 当前月份".date('m'); echo " 当前几号".date('d'); echo "";4.使用函数及数组来获取当月第一天及最后一天,比较实用 function getthemonth($date) { $firstday = date('Y-m-01', strtotime($date)); $lastday = date('Y-m-d', strtotime("$firstday +1 month -1 day")); return array($firstday,$lastday); } $today = date("Y-m-d"); $day=getthemonth($today); echo "当月的第一天: ".$day[0]." 当月的最后一天: ".$day[1]; echo "";5.封装了一个方法,开箱即用:$year = 2017;$month = 2; function get_month_first_and_last_day($year, $month) { if(empty($year) || empty($month)) { return array(); } $date = $year . "-" . $month; $begin_date = date('Y-m-01 00:00:00', strtotime($date)); $last_date = date('Y-m-d 23:59:59', strtotime("$begin_date +1 month -1 day")); return array('begin_date' => $begin_date, 'last_date' => $last_date); }$ret = get_month_first_and_last_day($year, $month);print_r($ret);Array( [begin_date] => 2017-02-01 00:00:00 [last_date] => 2017-02-28 23:59:59)
16、根据二维数组的数据字段名返回其对应的值数组
/** * 根据二维数组的数据字段名返回其对应的值数组 * * @param array $rows 二维数组 * @param string $field_name 字段名 * @param boolean $b_off_empty 是否排除空值,默认:true * @return array */function array_values_by_field_name($rows, $field_name, $b_off_empty = false){ $ret = array(); foreach($rows as $row) { if(isset($row[$field_name])) { if($b_off_empty) { if(!empty($row[$field_name])) { $ret[] = $row[$field_name]; } } else { $ret[] = $row[$field_name]; } } } return $ret;}
17、页面打印调试
if(!function_exists('dump')){ /** * 打印数据 * @param mixed $data (可以是字符串,数组,对象) * @param boolean $is_exit 是否退出程序,默认否 */ function dump($data, $is_exit = false) { echo ""; print_r($data); echo ""; if($is_exit) exit(); }}/** * Debug打印 * * @param string $title 显示的标题 * @param mixed $data 打印的数据 * @param boolean $b_new_line 是否空一行,默认:true * @return void */function debug_dump($title, $data, $b_new_line = true){ if(!empty($_GET['dump'])) { if(!empty($title)) dump($title); if(!empty($data)) dump($data); if($b_new_line) dump(); }}
18、ASCII字符转换
$charCode = "A"; // ord 返回 "A" 的 ASCII值:$charCodeord = ord($charCode) + 1 ; // ord($charCode) = 65$charCodeord = $charCodeord > 90 ? 0 : $charCodeord; $charCode = chr($charCodeord); // 66 => Becho $charCode; // 输出 B
19、生成唯一订单号
function get_order_sn(){ $map = array( '0' => array('n' => 16), '1' => array('n' => 17), '2' => array('n' => 18), '3' => array('n' => 19), '4' => array('n' => 20), '5' => array('n' => 21), '6' => array('n' => 22), '7' => array('n' => 23), '8' => array('n' => 24), '9' => array('n' => 25) ); $ymd = date('ymd', time()); // 不允许超过20位 while(1) { $rnd = rand(1, 99999999); $sn = $ymd.substr('00000000'.$rnd, -8); $sn_arr = str_split($sn); $v_code = 103; foreach($sn_arr as $v) { $v_code += $v * $map[$v]['n']; } $v_code = $v_code % 103; $djbh = $sn . $v_code; if(strlen($djbh) <= 20) { break; } } return $djbh;}// 调用$new_order_sn = get_order_sn(); // 1801098694194299
20、json_encode 中文不转义 php5.3及以下解决办法
function json_encode($array){if(version_compare(PHP_VERSION,'5.4.0','<')){$str = json_encode($array);$str = preg_replace_callback("#\\\u([0-9a-f]{4})#i",function($matchs){return iconv('UCS-2BE', 'UTF-8', pack('H4', $matchs[1]));},$str);return $str;}else{return json_encode($array, JSON_UNESCAPED_UNICODE);}}// 测试$data = array('name' => '刘德华', 'age' => 25, 'song_name' => 'Always love you ');$ret = json_encode($data);