分享一下自己封装的Laravel常用工具类
愿天堂没有BUG
共 7314字,需浏览 15分钟
· 2021-11-30
封装常用的工具类,不写重复代码,能极大的提高开发效率。
工具类函数
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
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论
真高!比亚迪员工爆料比亚迪在越南的薪资水平:基本工资480万,全勤奖35万,交通补助20万,餐补110万,每周6天,每天10小时
上一篇:某大公司为逼迫员工离职,竟然把他的工位安排到厕所旁,没想到他直接开始记录领导的如厕时间,还发到公司大群...对此,你怎么看?--完--PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。全文完,感谢你的耐心阅读。如果你还想看到我的文章,请一定给本
开发者全社区
0
太敢穿了!透视纱裙!性感火辣的身材
绝了呀今天的厂花:吴宣仪1995年1月26日,吴宣仪出生于海南省海口市,中国内地流行乐女歌手、影视演员。2016年2月,吴宣仪随宇宙少女发行首张迷你专辑正式出道。2018年4月,她参加《创造101》综艺选秀,获得第二名,成功加入火箭少女101组合。吴宣仪的颜值一直备受称赞,她的五官立体精致,皮肤白皙
逆锋起笔
0
某大公司为逼迫员工离职,竟然把他的工位安排到厕所旁,没想到他直接开始记录领导的如厕时间,还发到公司大群...
上一篇:字节的跳动职级与薪资(2024年)我们与公司间的合作,宛如两艘船只在茫茫大海上相互依靠,共同抵御风浪,携手驶向成功的彼岸。然而,当航向开始产生分歧,或是波涛汹涌的风浪改变了我们的初衷,我们或许应当冷静地选择和平分手,而非在风雨中硬撑。最近,一位网友的遭遇引起了广大职场人的关注和热议。这位网友
开发者全社区
0
金融研究 | 使用Python测量关键审计事项的「信息含量」
Tips: 公众号推送后内容只能更改一次,且只能改20字符。如果内容出问题,或者想更新内容, 只能重复推送。为了更好的阅读体验,建议阅读本文博客版, 链接地址https://textdata.cn/blog/2023-01-13-information-content-of-critical-aud
大邓和他的Python
0
我看阿里的年终奖总算发了!
到4月底了,这两天看朋友圈,发现阿里的年终奖终于发了,问了问老同学,也从网上检索了不少信息,基本搞清楚了阿里今年的年终奖情况。近来来阿里一些集团对绩效等级做了较大的调整,以前的旧绩效系统中,绩效分为3.25、3.5、3.75、4和5五个等级,其中4和5是较高绩效等级,较少见。而且之前3.5绩效内部划
公子龙
0
CVPR 2024|大视觉模型的开山之作!无需任何语言数据即可打造大视觉模型
↑ 点击蓝字 关注极市平台作者丨科技猛兽编辑丨极市平台极市导读 本文提出一种序列建模 (sequential modeling) 的方法,不使用任何语言数据,训练大视觉模型。>>加入极市CV技术交流群,走在计算机视觉的最前沿本文目录1 序列建模打造大视觉模型(来自 U
极市平台
1
金融研究(更新) | 使用Python构建关键审计事项的「信息含量」
Tips: 公众号推送后内容只能更改一次,且只能改20字符。如果内容出问题,或者想更新内容, 只能重复推送。为了更好的阅读体验,建议阅读本文博客版, 链接地址https://textdata.cn/blog/2023-01-13-information-content-of-critical-aud
大邓和他的Python
0
字节的跳动职级与薪资(2024年)
上一篇:阿里公布年终奖,P7, 3.5+,22W年终奖,还有35W长期现金激励,真香字节跳动自2012年3月成立以来,已经迅速成长为一个全球性的科技公司。其产品和服务已经遍布全球150多个国家与地区,并且支持超过75种不同的语言。在字节跳动的官方网站上,列出了一系列引人注目的产品和服务,包括但不限于
开发者全社区
0