Laravel常用工具类
工具类函数
Geom转成字符串
如果项目中有大量的计算经纬度需求,强烈建议使用PgSql的geometry类型
public static function formatGeomToStr($geomJson)
{
if (empty($geomJson)) {
return null;
}
$geomStr = '';
$data = json_decode($geomJson, true);
if ($data['lng'] !== '' && $data['lat'] !== '') {
$geomStr = "POINT({$data['lng']} {$data['lat']})";
} return $geomStr;
}
复制代码
计算两个坐标之间的距离
基于经纬度进行计算
public static function calcDistance($loc1, $loc2)
{
if (empty($loc1) || empty($loc2) || count($loc2) != 2 || count($loc1) != 2) {
return -1;
} $radLat1 = deg2rad(floatval($loc1['lat']));
$radLat2 = deg2rad(floatval($loc2['lat']));
$radLng1 = deg2rad(floatval($loc1['lng']));
$radLng2 = deg2rad(floatval($loc2['lng']));
$a = $radLat1 - $radLat2;
$b = $radLng1 - $radLng2;
$s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2))) * 6378.137;
return round($s, 3);
}
复制代码
批量更新数据拼接sql
这是我司大佬整理的,我就拿来主义贡献给大家了
//批量写入
public static function batchUpdate($multipleData, $tableName)
{
$firstRow = current($multipleData); $updateColumn = array_keys($firstRow);
$referenceColumn = isset($firstRow['id']) ? 'id' : current($updateColumn);
unset($updateColumn[0]);
// 拼接sql语句
$updateSql = "UPDATE " . $tableName . " SET ";
$sets = [];
$bindings = [];
foreach ($updateColumn as $uColumn) {
$setSql = '"' . $uColumn . '" = CASE ';
foreach ($multipleData as $data) {
$setSql .= 'WHEN "' . $referenceColumn . '" = ? THEN ? ';
$bindings[] = $data[$referenceColumn];
$bindings[] = $data[$uColumn];
}
$setSql .= 'ELSE "' . $uColumn . '" END ';
$sets[] = $setSql;
}
$updateSql .= implode(', ', $sets);
$whereIn = collect($multipleData)->pluck($referenceColumn)->values()->all();
$bindings = array_merge($bindings, $whereIn);
$whereIn = rtrim(str_repeat('?,', count($whereIn)), ',');
$updateSql = rtrim($updateSql, ", ") . ' WHERE "' . $referenceColumn . '" IN (' . $whereIn . ")";
return DB::connection('myProject')->update($updateSql, $bindings);
}
复制代码
格式化时间
最常用的工具了吧,几乎每个项目都会用到
public static function formatTimestampForClient($timestamp)
{
$formatString = '';
$now = time();
//一个小时内
$diffTime = $now - $timestamp;
if ($diffTime < 60) {
$formatString = '刚刚';
} else if ($diffTime < 3600) {
$formatString = intval($diffTime / 60) . "分钟前";
} else if ($diffTime < 12 * 3600) {
$formatString = intval($diffTime / 3600) . "小时前";
} else if ($diffTime < 24 * 3600) {
$formatString = "1天内";
} else if ($diffTime < 3 * 24 * 3600) {
$formatString = "3天内";
} return $formatString;
}
复制代码
获得随机字符串
第二个参数表示是否允许包括特殊字符
public static function getRandomStr($len, $special = true)
{
$chars = array(
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
"l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
"w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
"H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
"S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2",
"3", "4", "5", "6", "7", "8", "9"
); if ($special) {
$chars = array_merge($chars, array(
"!", "@", "#", "$", "?", "|", "{", "/", ":", ";",
"%", "^", "&", "*", "(", ")", "-", "_", "[", "]",
"}", "<", ">", "~", "+", "=", ",", "."
));
} $charsLen = count($chars) - 1;
shuffle($chars); //打乱数组顺序
$str = '';
for ($i = 0; $i < $len; $i++) {
$str .= $chars[mt_rand(0, $charsLen)]; //随机取出一位
}
return $str;
}
复制代码
根据生日计算星座
星座控看这里
public static function getZodiacSign($birth)
{
$month = date('m', $birth);
$day = date('d', $birth);
$signs = [
["20" => "水瓶座"],
["19" => "双鱼座"],
["21" => "白羊座"],
["20" => "金牛座"],
["21" => "双子座"],
["22" => "巨蟹座"],
["23" => "狮子座"],
["23" => "处女座"],
["23" => "天秤座"],
["24" => "天蝎座"],
["22" => "射手座"],
["22" => "摩羯座"]
];
$signStart = array_key_first($signs[$month - 1]);
$signName = $signs[$month - 1][$signStart];
if ($day < $signStart) {
$sign = array_values($signs[($month - 2 < 0) ? $month = 11 : $month -= 2]);
$signName = array_shift($sign);
}
return $signName;
}
复制代码
校验手机号的正确性
最常用的工具类之二
注意:各运营商投放的号段会有更新,可以不定期的查询一下,更新这个工具类
public static function checkPhoneNumber($phone_number)
{
//中国联通号码:130、131、132、145(无线上网卡)、155、156、185(iPhone5上市后开放)、186、176(4G号段)、175(2015年9月10日正式启用,暂只对北京、上海和广东投放办理),166,146
//中国移动号码:134、135、136、137、138、139、147(无线上网卡)、148、150、151、152、157、158、159、178、182、183、184、187、188、198
//中国电信号码:133、153、180、181、189、177、173、149、199
$g = "/^1[34578]\d{9}$/";
$g2 = "/^19[89]\d{8}$/";
$g3 = "/^166\d{8}$/";
if (preg_match($g, $phone_number)) {
return true;
} else if (preg_match($g2, $phone_number)) {
return true;
} else if (preg_match($g3, $phone_number)) {
return true;
}
return false;
}
复制代码
生成唯一标识:32位自定义字符串
Uuid 是一个非常好用的工具
public static function createUniqueId()
{
$uuid5 = Uuid::uuid4();
$uid = str_replace('-', '', $uuid5->toString()); return strtoupper($uid);
}
复制代码
获得毫秒
public static function getMicroSecond()
{
return intval(microtime(true) * 1000);
}
复制代码
生成订单号
电商项目必备
public static function createOrderId()
{
$microSecond = Utility::getMicroSecond();
return date("YmdHis", $microSecond / 1000) . sprintf("%03d", $microSecond % 1000) . rand(100000, 999999);
}
复制代码
判断是否是json
public static function isJson($value)
{
$data = json_decode($value, true); if (json_last_error() !== JSON_ERROR_NONE) {
return false;
} else if (!is_array($data)) {
return false;
} return true;
}
复制代码
获得ip
public static function getIp()
{
if (isset($_SERVER)) {
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$realip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else if (isset($_SERVER['HTTP_CLIENT_IP'])) {
$realip = $_SERVER['HTTP_CLIENT_IP'];
} else {
$realip = $_SERVER['REMOTE_ADDR'];
}
} else {
if (getenv('HTTP_X_FORWARDED_FOR')) {
$realip = getenv('HTTP_X_FORWARDED_FOR');
} else if (getenv('HTTP_CLIENT_IP')) {
$realip = getenv('HTTP_CLIENT_IP');
} else {
$realip = getenv('REMOTE_ADDR');
}
} return $realip;
}
复制代码
获得N天前、N天后时间戳
传入N值是一个比较好的思路,我之前搞了几个3天前、7天前、30天前这类的工具。
都不如传入N值来的科学。
//获取N天的0点时间戳
public static function getNDayTimestamp($n = 1)
{
return strtotime(date('Y-m-d', strtotime('+' . $n . ' day')));
} //获取N天前0点时间戳
public static function getBeforeNDayTimestamp($n = 1)
{
return strtotime(date('Y-m-d', strtotime('-' . $n . ' day')));
}
复制代码
手机号掩码
public static function maskPhone($phone)
{
$strLen = strlen($phone);
if ($strLen < 4) {
return '';
} else {
return substr_replace($phone, "****", 3, 4);
}
}
复制代码
判断时间戳是否是今天
public static function isToday($timestamp = 0)
{
$res = false;
if (date('Ymd', $timestamp) == date('Ymd')) {
$res = true;
}
return $res;
} 作者:王中阳Go
链接:https://juejin.cn/post/7034472567863951374
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Laravel常用工具类的更多相关文章
- js常用工具类.
一些js的工具类 复制代码 /** * Created by sevennight on 15-1-31. * js常用工具类 */ /** * 方法作用:[格式化时间] * 使用方法 * 示例: * ...
- IOS开发--常用工具类收集整理(Objective-C)(持续更新)
前言:整理和收集了IOS项目开发常用的工具类,最后也给出了源码下载链接. 这些可复用的工具,一定会给你实际项目开发工作锦上添花,会给你带来大大的工作效率. 重复造轮子的事情,除却自我多练习编码之外,就 ...
- Apache Commons 常用工具类整理
其实一直都在使用常用工具类,只是从没去整理过,今天空了把一些常用的整理一下吧 怎么使用的一看就明白,另外还有注释,最后的使用pom引入的jar包 public class ApacheCommonsT ...
- Android 常用工具类之SPUtil,可以修改默认sp文件的路径
参考: 1. 利用Java反射机制改变SharedPreferences存储路径 Singleton1900 2. Android快速开发系列 10个常用工具类 Hongyang import ...
- 封装一个简单好用的打印Log的工具类And快速开发系列 10个常用工具类
快速开发系列 10个常用工具类 http://blog.csdn.net/lmj623565791/article/details/38965311 ------------------------- ...
- javaweb常用工具类及配置文件备份
Javaweb常用工具类及配置文件备份 做一个代码备份,以后常用到的. hibernate工具类备份 package com.dly.service; /* * hibernate获取sessi ...
- [C#] 常用工具类——直接在浏览器输出数据
/// <summary> /// <para> </para> /// 常用工具类——直接在浏览器输出数据 /// <para> ---------- ...
- [C#] 常用工具类——加密解密类
using System; using System.Configuration; using System.Collections.Generic; using System.Text; using ...
- C#常用工具类——Excel操作类
/// 常用工具类——Excel操作类 /// <para> ------------------------------------------------</para> / ...
随机推荐
- STL priority_queue 优先队列 小记
今天做题发现一个很有趣的地方,竟然还是头一次发现,唉,还是太菜了. 做图论用STL里的priority_queue去优化prim,由于特殊需求,我需要记录生成树中是用的哪些边. 于是,我定义的优先队列 ...
- simpholders 官方网址 https://www.simpholders.com/
SimPholders可让你快速直接地访问iPhone模拟器应用的app文档.你可以通过SimPholders找到数据库文件.永久存储以及缓存,它是一个非常实用的app debug工具,同时还可以离线 ...
- 深入分析Java中的关键字static
在平时开发当中,我们经常会遇见static关键字.这篇文章就把java中static关键字的使用方法的原理进行一个深入的分析.先给出这篇文章的大致脉络: 首先,描述了static关键字去修饰java类 ...
- Ansible之roles模块--lnmp分布式部署
Ansible之roles模块--lnmp分布式部署 目录 Ansible之roles模块--lnmp分布式部署 1. role模块的作用 2. roles的目录结构 3. roles内个目录含义解释 ...
- 【SCOI2007】组队(单调性)
题目链接 大意 给定\(N\)个人与三个常量\(A,B,C\),每个人有两个属性:\(Hi\),\(Vi\). 现要让你选些人出来,定义\(Hmin\)为选出来的这些人中最小的\(Hi\)值,\(Vm ...
- 二进制安装tomcat
一.安装JDK 1.1 下载JDK 官网下载地址 1.2 安装JDK #cat install_jdk.sh #!/bin/bash DIR=`pwd` JDK_FILE="jdk-8u29 ...
- VScode git无法使用,Error: command 'git.push' not found 源代码管理无法使用的问题及解决方法
正常条件下,只要电脑中安装了Git,VScode就可以直接使用. 在开始界面有下图所示的功能: 在源代码管理栏目中: 如果没能正常工作,就看不到这些功能. 可能在用某些与git相关的功能时,如安装了G ...
- Ceres 四重奏 之 入门简介
Ceres 翻译为谷神星,是太阳系中的一颗矮行星,于1801年被意大利神父 Piazzi 首次观测到,但随后 Piazzi 因为生病,跟丢了它的运行轨迹. 几个月后,德国数学家 Gauss,利用最小二 ...
- .Net Core Aop之IResourceFilter
一.简介 在.net core 中Filter分为一下六大类: 1.AuthorizeAttribute(权限验证) 2.IResourceFilter(资源缓存) 3.IActionFilter(执 ...
- ansible批量修改服务器密码
看了一下网上代码大多数是ansible-playbook实现的,需要写一个脚本,或者手动传递变量进去. 以前用python tcp模块写过客户端主动上报修改密码脚本 今天写一个ansible主控客户端 ...