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> / ...
随机推荐
- AT2274 [ARC066D] Contest with Drinks Hard
先考虑不修改怎么做,可以令 \(dp_i\) 表示前 \(i\) 个题能获得的最大得分.那么我们有转移: \[dp_i = \min\{dp_{i - 1}, dp_{j} + \frac{(i - ...
- [NOI Online #1 提高组]
A 首先从 \(t = 2\) 的特殊部分分出发. 不难发现这个操作是很不直观的,于是可以考虑对于每个操作 \((u, v)\) 在 \(u, v\) 之间连一条无向边. 显然连通块之间要分开考虑,对 ...
- 简单说说ES6新特性
ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了. 它的目标,是使得 JavaScript 语言可以用来编写复杂的大型 ...
- 连接mysql出现“Unable to load authentication plugin 'caching_sha2_password”错误
这是mysql 8.0版本才出现的问题,原因是mysql 8.0 默认使用 caching_sha2_password 身份验证机制 -- 从原来的 mysql_native_password 更改为 ...
- CSS控制图片大小
转载请注明来源:https://www.cnblogs.com/hookjc/ 1.CSS控制背景图片: 对于一个网页,我们开始设计的时候,可能没有过多的去想背景图到底是什么,因为大多都是设计背 ...
- eclipse中快捷键中逗号是怎么用的,如ctrl+2,L
Ctrl +2 同时按下,松开后,再按下L
- JS实现继承,封装一个extends方法
父类 function Person(name,age){ this.name = name; this.age = age; } Person.prototype = { eat:function( ...
- LinkedHashSet、Map、Map接口HashMap、Hashtable,TreeSet、TreeMap、如何选择使用集合实现类,Collections工具类
一.Set接口实现类LinkedHashSet 实现继承图: 1.LinkedHashSet的全面说明 1) LinkedHashSet是 HashSet的子类 2) LinkedHashSet底层是 ...
- 在MacOS安装puppeteer
安装node:升级:npm i npm 安装yarn:需要注意先把yarn的流程跑完,特别是package.json 安装puppeteer:yarn add puppeteer 安装完成以后需要重启 ...
- 小程序"errcode":41002错误问题如何解决?
我的问题是:小程序在本地测试的时候是没有问题的,但是当我扫开发者中的项目中的二维码手机浏览测试的时候发现是没有数据的,然后调试工具中出现: {"errcode":41002,&qu ...