工作中常用的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
* <li>当$b_only_img_url = true时,只返回图片地址的一维数组</li>
* <li>当$b_only_img_url = false时,返回图片地址的多种信息,二维数组,如下:</li>
* <li>img_tag => '<img src="http://www.baidu.com/img/bdlogo.gif" />'</li>
* <li>img_src => 'src="http://www.baidu.com/img/bdlogo.gif"'</li>
* <li>img_url => 'http://www.baidu.com/img/bdlogo.gif'</li>
*/
function get_img_list_from_content($content, $b_only_img_url = true)
{
preg_match_all('/<img[^>]*?(?P<img_src_arr>src\s*=\s*([\'"]|"|'|')(?P<img_url_arr>.*?)([\'"]|"|'|'))[^>]*?>/msi', $content, $match);
$arr_temp = array();
if($match['img_url_arr'])
{
foreach($match['img_url_arr'] as $key => $img_url)
{
if($b_only_img_url)
{
$img_info = $img_url;
}
else
{
$img_info = array(
'img_tag' => $match[0][$key],
'img_src' => $match['img_src_arr'][$key],
'img_url' => $match['img_url_arr'][$key],
);
}
$arr_temp[] = $img_info;
}
}
return $arr_temp;
}
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 是否过滤所有标签,还是只保留<p>和<br>
* @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, '<p><br>');
$b_pure == false && $content = strip_tags($content);
$mixed_arr = array(
'/[\r\n]*?/' => '', //并为一行
'/<span class=[\'"]?item_title_in_blog[\'"]?>.*<\/span>/iU' => '',
'/(rel="item"\/>)<br \/><br \/>[^<]*?<br \/><br \/>/iU' => '$1',
'/&[a-z]+;/' => '',
'/<([a-z]+)[^>]*?>/i' => '<\1>',
'/(<\/?br\s*?\\/?\s*?>){2,}/i' => '\1',
'/(<br>\s*){2,}/' => '<br>',
'/<[^>]*?$/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 "<script language='javascript'>
try{window.parent.showMsgBox('信息','{$msg}');}
catch(e){alert('{$msg}');}";
if($url) echo "window.parent.location = '{$url}';";
if($b_reload) echo "window.parent.location.reload();";
echo "</script>";
exit;
}
}
// 举例:
index.php
<?php
$user_id = (int)$_POST['user_id'];
$msg = $user_id > 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('请求的内容不存在...<br>三秒后自动跳转。');
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、获取对象的公共属性
<?php
trait AttributesTrait
{
/**
* 获取公共属性的方法
* $obj object 对象
*/
function publics($obj)
{
// 判断传递判断传递的
if(!is_object($obj)) return array();
return json_decode(json_encode($obj), true);
}
}
class User
{
use AttributesTrait;
public $name = "kingmax";
private $_age = 30;
}
$User = new User();
$data = $User->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 '<html>';
echo '<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>';
echo '<script type="text/javascript">';
if(!empty($alert)) echo 'window.alert("' . $alert . '");';
if(!empty($url))
{
echo $b_parent ? 'parent.window.location.href = "' . $url . '";' : 'window.location.href = "' . $url . '";';
}
else
{
echo $b_parent ? 'parent.window.history.back();' : 'window.history.back();';
}
echo '</script>';
exit();
}
15、获取某月的第一天和最后一天
// php获取当月天数及当月第一天及最后一天、上月第一天及最后一天实现方法
1.获取上个月第一天及最后一天.
echo date('Y-m-01', strtotime('-1 month'));
echo "<br/>";
echo date('Y-m-t', strtotime('-1 month'));
echo "<br/>";
2.获取当月第一天及最后一天.
$BeginDate=date('Y-m-01', strtotime(date("Y-m-d")));
echo $BeginDate;
echo "<br/>";
echo date('Y-m-d', strtotime("$BeginDate +1 month -1 day"));
echo "<br/>";
3.获取当天年份、月份、日及天数.
echo " 本月共有:".date("t")."天";
echo " 当前年份".date('Y');
echo " 当前月份".date('m');
echo " 当前几号".date('d');
echo "<br/>";
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 "<br/>";
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 "<pre>";
print_r($data);
echo "</pre>";
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 => B
echo $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);