php 常用函数库(var_export 现代紧凑风格、毫秒时间戳、高效遍历目录、语义化时间、计算间隔天数、计算生日年龄、不重复的序列号)
var_export() 方法的现代风格版
/**
* var_export() 方法的现代风格版
* 说明:原始版:array(), 现代版:[]
* @param mixed $var
* @param string $indent 缩进内容,默认是空格
* @param boolean $isCompact 是否紧凑模式,即数组是否换行
* @return string
*/
function varExport($var, $indent = '', $isCompact = true)
{
switch (gettype($var)) {
case "string":
return '\'' . addcslashes($var, "\\\$\"\r\n\t\v\f") . '\'';
case "array":
if (count($var) == 0) {
return '[]';
}
$newLine = $isCompact ? '' : "\n";
$itemSpace = $isCompact ? "$indent " : "$indent ";
$indexed = array_keys($var) === range(0, count($var) - 1);
$r = [];
foreach ($var as $key => $value) {
$r[] = $itemSpace . ($indexed ? "" : varExport($key) . " => ") . varExport($value, $itemSpace);
}
return "[$newLine" . implode(",$newLine", $r) . "$newLine" . $indent . "]";
case "boolean":
return $var ? "TRUE" : "FALSE";
default:
return var_export($var, true);
}
}
高效递归遍历文件夹
/**
* PHP 高效遍历文件夹(大量文件不会卡死,带文件名排序功能)
* @param string $path 目录路径
* @param integer $level 目录深度层级
* @param boolean $showfile 是否显示文件(否则只遍历显示目录)
* @param array $skips 要忽略的文件路径集合
* @param integer $deepth 扫描深度
*/
function fastScanDir($path = './', $level = 0, $showfile = true, $skips = array(), $deepth = 0)
{
if (!file_exists($path) || ($deepth && $level > $deepth)) {
return array();
}
$path = str_replace('//', '/', $path . '/');
$file = new \FilesystemIterator($path);
$filename = '';
$icon = ''; // 树形层级图形
if ($level > 0) {
$icon = ('|' . str_repeat('--', $level));
}
$outarr = array();
foreach ($file as $fileinfo) {
$filename = iconv('GBK', 'utf-8', $fileinfo->getFilename()); // 解决中文乱码
$filepath = $path . $filename;
if ($fileinfo->isDir()) {
if (!($skips && in_array($filepath . '/', $skips))) {
$outarr[$filename] = array('path' => $filepath, 'type' => 'dir', 'icon' => $icon);
$outarr[$filename]['children'] = fastScanDir($filepath, $level + 1, $showfile);
}
continue;
}
if ($showfile && !($skips && !in_array($filepath, $skips))) {
$outarr[$filename] = array('path' => $filepath, 'type' => 'file', 'icon' => $icon);
}
}
if ($outarr) {
ksort($outarr);
}
return $outarr;
}
返回标准格式消息
/**
* 返回标准消息格式
* @param integer|boolean $status 状态,值为 0 或 1
* @param string $msg 错误消息内容
* @param mixed $data 成功的数据
* @param string $code 代码
* @return array ['status','msg','data','code']
*/
function stdmessage($status, $msg, $data = '', $code = '')
{
return [
'status' => intval($status),
'msg' => $msg,
'data' => $data,
'code' => $code,
];
}
返回语义化时间格式
/**
* 返回语义化时间
* @param integer|string $time 时间
* @param string $break 断点,超过断点以后的时间会直接以指定的日期格式显示
* @param string $format 日期格式, 与$break参数结合使用
* @param boolean $aliasable 是否允许以 昨天、前天 来代替 1 天前、2 天前
* @return string 返回语义化时间,例如:几秒,几分,几小时,几天前,几小时前,几月前 等
* @example
* humantime(strtotime('-5 month'), 'month') 返回 2019-10-27 17:50:17
* humantime(strtotime('-5 month'), 'year') 返回 5 个月前
* humantime(strtotime('yesterday')) 返回 昨天
* humantime(strtotime('-2 day')); 返回 前天
*/
function humantime($time, $break = '', $format = 'Y-m-d H:i:s', $aliasable = true)
{
if (!$time) {
return '';
}
if (!is_numeric($time)) {
$time = strtotime($time);
}
$text = '';
$seconds = time() - $time;
if ($seconds > 0) {
$formater = array(
'second' => ['time' => '1', 'text' => '秒'],
'minute' => ['time' => '60', 'text' => '分钟'],
'hour' => ['time' => '3600', 'text' => '小时'],
'day' => ['time' => '86400', 'text' => '天', 'alias' => ['1' => '昨天', '2' => '前天']],
'week' => ['time' => '604800', 'text' => '星期'],
'month' => ['time' => '2592000', 'text' => '个月'],
'year' => ['time' => '31536000', 'text' => '年'],
);
$prevName = '';
foreach ($formater as $name => $data) {
if ($seconds < intval($data['time'])) {
$prevData = $formater[$prevName];
$count = floor($seconds / intval($prevData['time']));
if ($aliasable && isset($prevData['alias']) && isset($prevData['alias'][strval($count)])) {
$text = $prevData['alias'][strval($count)];
break;
}
$text = $count . ' ' . $prevData['text'] . '前';
break;
}
$prevName = $name;
if ($break && ($name == $break)) {
$text = date($format, $time);
break;
}
}
} else {
$text = date($format, $time);
}
return $text;
}
返回当前时间的毫秒时间戳
/**
* 返回当前的毫秒时间戳
*/
function microtimestamp()
{
return round(microtime(true) * 1000);
}
计算两个日期的相差天数
/**
* 计算两个日期的相差天数
* @param string $date1 日期1
* @param string $date1 日期2
* @return int 返回相差的天数
*/
function diffDays($date1, $date2)
{
return abs(strtotime($date1) - strtotime($date2)) / 86400;
}
根据生日计算年龄
/**
* 根据生日计算年龄
* @param string $birthday 生日
* @return int 返回年龄
*/
function calcAge($birthday)
{
$age = empty($birthday) ? false : strtotime($birthday);
if (!$age) {
return 0;
}
list($y1, $m1, $d1) = explode("-", date("Y-m-d", $age));
list($y2, $m2, $d2) = explode("-", date("Y-m-d"), time());
$age = $y2 - $y1;
if (intval($m2 . $d2) < intval($m1 . $d1)) {
$age -= 1;
}
return $age;
}
返回简短文字内容
/**
* 返回简短文字
* @param string $text
* @param integer $length 前面保留的长度
* @param integer $lastLen 后面保留的长度
* @param string $ellipsis 省略号
* @return string 返回截短的字符串
*/
function shortText($text, $length, $lastLen = 0, $ellipsis = '...')
{
if (empty($text) || mb_strlen($text) <= $length) {
return $text;
}
if ($lastLen > 0) {
$text = mb_substr($text, 0, $length - $lastLen) . $ellipsis . mb_substr($text, -$lastLen);
} else {
$text = mb_substr($text, 0, $length) . $ellipsis;
}
return $text;
}
返回简短MD5内容
/**
* 返回简短 MD5 (16位)
* @param string $text
* @param integer $start 起始位置,默认值 8
* @param integer $len 长度,默认值 16
* @return string
*/
function shortMD5($text, $start = 8, $len = 16)
{
return substr(md5(strval($text)), $start, $len);
}
返回不重复的序列号
/**
* 返回不重复序列号
* 用途:唯一订单号、序列号等
* 说明:新的字符串长度大约是原来长度的一半,比如12位生成6位,21位生成13位
* @param string $prefix 前缀
* @return string
*/
function hashSerial($prefix = '')
{
$time = date('y-m-d-h-i-s');
if (is_numeric($prefix)) {
$time = chunk_split(strval($prefix), 2, '-') . $time;
$prefix = '';
}
$atime = explode('-', $time);
foreach ($atime as $stime) {
$itime = $stime * 1;
if ($itime < 26) {
$prefix .= chr(65 + $itime);
continue;
}
if ($itime >= 48 && $itime <= 57) {
$prefix .= chr($itime);
continue;
}
$prefix .= $stime;
}
return $prefix;
}
去除SQL脚本中的所有注释内容
/**
* 去除SQL脚本中的所有注释内容
* @param string $sqltext 多行SQL文本
* @return string 返回没有注释的SQL文本
*/
function clearSqlComments($sqltext)
{
$lines = explode("\n", $sqltext);
$data = [];
$hasMultip = false;
foreach ($lines as $line) {
// 去除空行
$line = ltrim($line);
if ($line == '') {
continue;
}
// 去除单行注释
$line = ltrim(preg_replace("/--[^\n|\r|^']*[\n|\r]$/", '', $line));
if ($line == '') {
continue;
}
// 去除多行注释
if (0 === strpos($line, '/*')) {
$hasMultip = true;
continue;
}
if (0 === strpos($line, '*/')) {
$hasMultip = false;
continue;
}
if ($hasMultip && 0 == strpos($line, '*')) {
continue;
}
$data[] = $line;
}
return implode("\n", $data);
}
分割多行SQL文本到数组
/**
* 分割多行SQL文本到数组
* @param string $sqltext 多行SQL文本
* @return array 返回数组
*/
function splitSqlText($sqltext)
{
return empty($sqltext) ? [] : explode(";\r", $sqltext);
}