PHP相关知识点整理
- 数组合并
数组合并有三种方法
1、用array_merge
array_mergre(
a
r
r
1
,
arr1,
arr1,arr2)
注意:对于重复的字符串键,array_merge后,后面数组的键值会覆盖前面的
2、用+
a
r
r
1
+
arr1+
arr1+arr2
注意:对于重复的字符串键,+操作后,前面数组的键值会覆盖后面的
3、用array_merge_recursive
array_merge_recursive(
a
r
r
1
,
arr1,
arr1,arr2)
注意:对于重复的字符串键,array_merge_recursive后,相同键名的键值会被合并到同一数组中(会递归)
- 根据地址获取经纬度
function getlan($address)
{
//$address是具体地址
// 腾讯地图
$url = "http://apis.map.qq.com/ws/geocoder/v1/?address=$address&key=VKNBZ-Z6T3J-HI3FJ-KMNFK-QRO6E-CCBRW";
// 初始url会话
$ch = curl_init();
// 设置url传输选项
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 执行url会话
$data = curl_exec($ch);
$map = json_decode($data);
//var_dump($map);
$location = $map->result->location;
//return $location;
echo "经度:" . $location->lng . "<br/>";// 经度
echo "纬度:" . $location->lat . "<br/>";// 纬度
}
3.生成菊花码—小程序码
function phpcode($param1)
{
header('content-type:text/html;charset=utf-8');
//配置APPID、APPSECRET
$APPID = "";
$APPSECRET = "";
//获取access_token
$access_token = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$APPID&secret=$APPSECRET";
//缓存access_token
session_start();
$_SESSION['access_token'] = "";
$_SESSION['expires_in'] = 0;
$ACCESS_TOKEN = "";
if(!isset($_SESSION['access_token']) || (isset($_SESSION['expires_in']) && time() > $_SESSION['expires_in'])) {
$json = httpRequest( $access_token );
$json = json_decode($json,true);
// var_dump($json);
$_SESSION['access_token'] = $json['access_token'];
$_SESSION['expires_in'] = time()+7200;
$ACCESS_TOKEN = $json["access_token"];
}else{
$ACCESS_TOKEN = $_SESSION["access_token"];
}
//构建请求二维码参数
//path是扫描二维码跳转的小程序路径,可以带参数?id=xxx
//width是二维码宽度
//$qcode ="https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=$ACCESS_TOKEN";
$qcode = "https://api.weixin.qq.com/wxa/getwxacode?access_token=$ACCESS_TOKEN";
//便于传参
$param = json_encode(array("path"=>"page/index/index","width"=> 140,"scene"=>$param1));
//POST参数
$result = httpRequest( $qcode, $param,"POST");
$file="./phpqrcode/$param1-qrcode.png";//小程序码路径自定义,根目录下
//生成二维码
file_put_contents($file, $result);
$image = \think\Image::open($file);
$res=file_exists( 'package/'.$param1.'thumb.png');
if($res){
$code='package/'.$param1.'thumb.png';
}else{
$image->thumb(140, 140)->save('package/'.$param1.'thumb.png');//生成缩略图,根据需求
$code='package/'.$param1.'thumb.png';
}
return $code;
}
//把请求发送到微信服务器换取二维码
function httpRequest($url, $data='', $method='GET'){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
if($method=='POST')
{
curl_setopt($curl, CURLOPT_POST, 1);
if ($data != '')
{
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
}
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curl);
curl_close($curl);
return $result;
}
- 生成图片,多条水印包括文字和图片
function images()
{
//打开背景图
$image = \think\Image::open('./posterBg.png');
//字体路径
$path=ROOT_PATH.'public/font/PingFang-Bold-1.ttf';
$path1=ROOT_PATH.'public/font/PingFang Regular.ttf';
//海报存储路径
$file='/package/'.$id.'text_image.png';
//给背景图加文字和图片水印
$image->text($title,$path,20,'#000000',array(200,280))
->water($thumb,array(62,350))
->text('¥',$path,14,'#FA3605',array(62,600))
->text($price,$path,20,'#FA3605',array(80,595))
->text('门店价:¥'.$original,$path1,16,'#666666',array(62,635))
->text('——————',$path1,20,'#666666',array(62,645))
->text('消费赚',$path,18,'#4C4C4C',array(415,600))
->water('./iconMoney.png',array(369,595))
->text('¥'.$commission,$path,16,'#FA3605',array(415,635))
->text($house,$path,20,'#000000',array(62,700))
->text('电话:'.$house_phone,$path1,18,'#000000',array(62,760))
->text('地址:'.$province.$city,$path1,18,'#000000',array(62,800))
->text($area.$address,$path1,18,'#000000',array(135,835))
->water($code,array(340,700))
->text('长按识别二维码',$path1,16,'#000000',array(355,855))
->save('package/'.$id.'text_image.png');
return $file;
}
//根据需求调整样式,array里面的是距离左边的宽度和距离顶部的高度
- 时间戳
//今日开始时间戳和结束时间戳
$beginToday=mktime(0,0,0,date('m'),date('d'),date('Y'));
$endToday=mktime(0,0,0,date('m'),date('d')+1,date('Y'))-1;
//昨日起始时间戳和结束时间戳
$beginYesterday=mktime(0,0,0,date('m'),date('d')-1,date('Y'));
$endYesterday=mktime(0,0,0,date('m'),date('d'),date('Y'))-1;
//上周起始时间戳和结束时间戳
$beginLastweek=mktime(0,0,0,date('m'),date('d')-date('w')+1-7,date('Y'));
$endLastweek=mktime(23,59,59,date('m'),date('d')-date('w')+7-7,date('Y'));
//获取本周起始时间戳和结束时间戳
$beginThisweek = mktime(0,0,0,date('m'),date('d')-date('w')+1,date('y'));
$endThisweek=time();
//本月起始时间戳和结束时间戳
$beginThismonth=mktime(0,0,0,date('m'),1,date('Y'));
$endThismonth=mktime(23,59,59,date('m'),date('t'),date('Y'));
$data['sel_time'] = '2018-11';
$data['begin_time'] = strtotime($data['sel_time']);//指定月份的开始时间戳
$data['end_time'] = mktime(23,59,59,date('m',strtotime($data['sel_time']))+1,00); //指定月份月末时间戳
//计算开始到截止时间
//$i 是你要从今天往前推多少天, 一周前$i为7,以此类推
$m = date('Y-m-d', mktime(0,0,0,date('m')-$i,1,date('Y')));
$t = date('t',strtotime($m)); //上个月共多少天
$data['begin']= mktime(0,0,0,date('m')-$i,1,date('Y')); //上个月的开始日期
$data['end'] =mktime(0,0,0,date('m')-$i,$t,date('Y')); //上个月的结束日期
7.验证身份证号码
// 计算身份证校验码,根据国家标准GB 11643-1999
function idcard_verify_number($idcard_base){
if(strlen($idcard_base)!=17){
return false;
}
//加权因子
$factor=array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);
//校验码对应值
$verify_number_list=array('1','0','X','9','8','7','6','5','4','3','2');
$checksum=0;
for($i=0;$i<strlen($idcard_base);$i++){
$checksum += substr($idcard_base,$i,1) * $factor[$i];
}
$mod=$checksum % 11;
$verify_number=$verify_number_list[$mod];
return $verify_number;
}
// 将15位身份证升级到18位
function idcard_15to18($idcard){
if(strlen($idcard)!=15){
return false;
}else{
// 如果身份证顺序码是996 997 998 999,这些是为百岁以上老人的特殊编码
if(array_search(substr($idcard,12,3),array('996','997','998','999')) !== false){
$idcard=substr($idcard,0,6).'18'.substr($idcard,6,9);
}else{
$idcard=substr($idcard,0,6).'19'.substr($idcard,6,9);
}
}
$idcard=$idcard.idcard_verify_number($idcard);
return $idcard;
}
// 18位身份证校验码有效性检查
function idcard_checksum18($idcard){
if(strlen($idcard)!=18){
return false;
}
$idcard_base=substr($idcard,0,17);
if(idcard_verify_number($idcard_base)!=strtoupper(substr($idcard,17,1))){
return false;
}else{
return true;
}
}
8 、根据地址获取经纬度
//根据地址获取经纬度
function getlan($address)
{
// 腾讯地图
$url = "http://apis.map.qq.com/ws/geocoder/v1/?address=$address&key=VKNBZ-Z6T3J-HI3FJ-KMNFK-QRO6E-CCBRW";
// 初始url会话
$ch = curl_init();
// 设置url传输选项
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 执行url会话
$data = curl_exec($ch);
$map = json_decode($data);
//var_dump($map);
$location = $map->result->location;
return $location;
echo "经度:" . $location->lng . "<br/>";// 经度
echo "纬度:" . $location->lat . "<br/>";// 纬度
}
9、隐藏手机号或身份证号
//隐藏手机号或身份证号
function func_substr_replace($str, $replacement = '*', $start = 3, $length =12)
{
$len = mb_strlen($str,'utf-8');
if ($len > intval($start+$length)) {
$str1 = mb_substr($str,0,$start,'utf-8');
$str2 = mb_substr($str,intval($start+$length),NULL,'utf-8');
} else {
$str1 = mb_substr($str,0,1,'utf-8');
$str2 = mb_substr($str,$len-1,1,'utf-8');
$length = $len - 2;
}
$new_str = $str1;
for ($i = 0; $i < $length; $i++) {
$new_str .= $replacement;
}
$new_str .= $str2;
return $new_str;
}
10、获取access_token
//获取access_token
function get_access_token($appid,$appsecret,$uid=0)
{
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
if(!cache('access_token')){
$info = https_request($url);
$info = json_decode($info,true);
cache('access_token',$info['access_token'],6000);
}
return cache('access_token');
}
function https_request($url, $data = null)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
if (!empty($data)) {
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}
11、上传图片到阿里云
function upload( $module,$file_path)
{
$KeyId = config('sys.AccessKeyID');
$KeySecret = config('sys.AccessKeySecret');
$EndPoint = config('sys.EndPoint');
$Bucket = config('sys.Bucket');
$oss_path= 'uploads/' .$module. sha1(date('YmdHis', time()) . uniqid()) . '.jpg' ;;
try {
$ossClient = new OssClient($KeyId, $KeySecret, $EndPoint);
$ossClient->uploadFile($Bucket, $oss_path, $file_path);
return $oss_path;
} catch (OssException $e) {
// operate_log("-1", 'AliOss', '文件上传失败:' . $e->getErrorCode() . ':' . $e->getErrorMessage() . "未上传的文件名 " . $file_path);
return null;
}
}
12、删除本地文件
//删除本地文件
function delDir($module,$id) {
$dir='./'.$module.'/'.$id;
//先删除目录下的文件:
$dh=opendir($dir);
while ($file=readdir($dh)) {
if($file!="." && $file!="..") {
$fullpath=$dir."/".$file;
if(!is_dir($fullpath)) {
unlink($fullpath);
} else {
$this->delDir($fullpath);
}
}
}
closedir($dh);
//删除当前文件夹:
if(rmdir($dir)) {
return true;
} else {
return false;
}
}
//删除文件-阿里云
function AilDelFile($module,$id)
{
$KeyId = config('sys.AccessKeyID');
$KeySecret = config('sys.AccessKeySecret');
$EndPoint = config('sys.EndPoint');
$Bucket = config('sys.Bucket');
if ($module=='product'){
$data=\think\Db::name('code_photo')->where("product_id",$id)->where("type=2")->field('shareCode')->select();
}else{
$data=\think\Db::name('code_photo')->where("product_id",$id)->where("type=1")->field('shareCode')->select();
}
$objects = array();
foreach ($data as $k=>$v){
$objects[$k] = $v['shareCode'];
}
try {
$ossClient = new OssClient($KeyId, $KeySecret, $EndPoint);
// $ossClient->deleteObjects($Bucket, $objects);
$ossClient->deleteObjects($Bucket, $objects);
return true;
} catch (OssException $e) {
return false;
}
}
13
//创建TOKEN
function createToken() {
$code = chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE)) . chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE)) . chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE));
session('TOKEN', authcode($code));
}
//判断TOKEN
function checkToken($token) {
if ($token == session('TOKEN')) {
session('TOKEN', NULL);
return TRUE;
} else {
return FALSE;
}
}
/* 加密TOKEN */
function authcode($str)
{
$key = "YOURKEY";
$str = substr(md5($str), 8, 10);
return md5($key . $str);
}
14、发送模板信息
function sendmessage($openid,$template_id,$first,$keyword1,$keyword2,$keyword3,$remark)
{
$data=[];
$arr['openid']=$openid;//接受信息的openID可以是多个用逗号隔开
$arr['template_id']=$template_id;
//组装推送信息
$data['first']=$first;
$data['keyword1']=$keyword1;
$data['keyword2']=$keyword2;
$data['keyword3']=$keyword3;
$data['remark']=$remark;
return index_send($arr,$data);
}
function index_send($arr,$data){
$data=[
'touser'=>$arr['openid'],//openID
'template_id'=>$arr['template_id'],//模板id
'url'=>$web_url = "http://".$_SERVER['SERVER_NAME'],
'topcolor'=>"#FF0000",
'data'=>array(
"first"=>array("value"=>$data['first'], "color"=>"#173177" ),
"keyword1"=>array('value'=>$data['keyword1'],'color'=>"#173177"),
"keyword2"=>array('value'=>$data['keyword2'],'color'=>"#173177"),
"keyword3"=>array('value'=>$data['keyword3'],'color'=>"#173177"),
"remark"=>array('value'=>$data['remark'],'color'=>"#173177"),
)
];
//获取access_token
$get_all_access_token = get_all_access_token();
$json_data=json_encode($data);//转化成json数组让微信可以接收
$url="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$get_all_access_token;//模板消息请求URL
$res=curl_post($url,urldecode($json_data));//请求开始
$res=json_decode($res,true);
if($res['errcode']==0 && $res['errmsg']=="ok"){
return json(['st'=>1,'msg'=>'发送成功']);
}else{
return json(['st'=>0,'msg'=>'发送失败']);
}
}
变量修饰符
input函数支持对变量使用修饰符功能,可以更好的过滤变量。
用法如下:
input(‘变量类型.变量名/修饰符’);
或者
Request::instance()->变量类型(‘变量名/修饰符’);
例如:
input(‘get.id/d’);
input(‘post.name/s’);
input(‘post.ids/a’);
Request::instance()->get(‘id/d’);
ThinkPHP5.0版本默认的变量修饰符是/s,如果需要传入字符串之外的变量可以使用下面的修饰符,包括:
修饰符 作用
s 强制转换为字符串类型
d 强制转换为整型类型
b 强制转换为布尔类型
a 强制转换为数组类型
f 强制转换为浮点类型
如果你要获取的数据为数组,请一定注意要加上 /a 修饰符才能正确获取到。