PHP常用方法封装

通过身份证号获取生日

php 复制代码
function get_birthday($id_card = '') {
    if (!$id_card) {
        return '';
    }
    if (strlen($id_card) === 18) {
        return substr($id_card,6,4) . '-' . substr($id_card,10,2) . '-' . substr($id_card,12,2);
    }
    if (strlen($id_card) === 15) {
        return '19' . substr($id_card,6,2) . '-' . substr($id_card,8,2) . '-' . substr($id_card,10,2);
    }
    return '';
}

获取访问者的IP

php 复制代码
function get_ip(){
    if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")){
        $ip = getenv("HTTP_CLIENT_IP");
    }else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")){
        $ip = getenv("HTTP_X_FORWARDED_FOR");
    }else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")){
        $ip = getenv("REMOTE_ADDR"); 
    }else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")){
        $ip = $_SERVER['REMOTE_ADDR'];
    } else {
        $ip = "unknown";
    }
    return($ip);
}
get_ip()

对二维数组进行排序

php 复制代码
/**
 * 对二维数组进行排序
 * @param array $list 对二维数组
 * @param string $field 排序的键名
 * @param string $sortby 排序类型 (asc正向排序 desc逆向排序 nat自然排序)
 * @return array
 */
function list_sort_by($list = [], $field = 'id', $sortby = 'asc'){
    if (is_array($list)){
        $refer = $resultSet = array();
        foreach ($list as $i => $data){
            $refer[$i] = &$data[$field];
        }
        switch ($sortby){
            case 'asc': // 正向排序
                asort($refer);
                break;
            case 'desc': // 逆向排序
                arsort($refer);
                break;
            case 'nat': // 自然排序
                natcasesort($refer);
                break;
        }
        foreach ($refer as $key => $val){
            $resultSet[] = &$list[$key];
        }
        return $resultSet;
    }
    return false;
}
$new_list = list_sort_by($list, 'class', 'asc');//按照数组里的class进行排序
echo '<pre>';//原样输出数组
print_r($new_list);
echo '<pre>';

获取指定时间内日期、月份、季度、年份

php 复制代码
/**
 * 查询指定时间范围内的所有 日期,月份,季度,年份
 * @param $startDate   指定开始时间,Y-m-d格式
 * @param $endDate     指定结束时间,Y-m-d格式
 * @param $type        类型,day 天,month 月份,quarter 季度,year 年份
 * @return array
*/
function getDate($startDate = '2025-01-01', $endDate = '2025-02-01', $type = 'day') {
	if (date('Y-m-d', strtotime($startDate)) != $startDate || date('Y-m-d', strtotime($endDate)) != $endDate) {
		return '日期格式不正确';
	}
	$tempDate = $startDate;
	$returnData = [];
	$i = 0;
	if ($type == 'day') {    // 查询所有日期
		while (strtotime($tempDate) < strtotime($endDate)) {
			$tempDate = date('Y-m-d', strtotime('+' . $i . ' day', strtotime($startDate)));
			$returnData[] = $tempDate;
			$i++;
		}
	} elseif ($type == 'month') {    // 查询所有月份以及开始结束时间
		while (strtotime($tempDate) < strtotime($endDate)) {
			$temp = [];
			$month = strtotime('first day of +' . $i . ' month', strtotime($startDate));
			$temp['name'] = date('m', $month);
			$temp['startDate'] = date('Y-m-01', $month);
			$temp['endDate'] = date('Y-m-t', $month);
			$tempDate = $temp['endDate'];
			$returnData[] = $temp;
			$i++;
		}
	} elseif ($type == 'quarter') {    // 查询所有季度以及开始结束时间
		while (strtotime($tempDate) < strtotime($endDate)) {
			$temp = [];
			$quarter = strtotime('first day of +' . $i . ' month', strtotime($startDate));
			$q = ceil(date('n', $quarter) / 3);
			$temp['name'] = date('Y', $quarter) . '第' . $q . '季度';
			$temp['startDate'] = date('Y-m-01', mktime(0, 0, 0, $q * 3 - 3 + 1, 1, date('Y', $quarter)));
			$temp['endDate'] = date('Y-m-t', mktime(23, 59, 59, $q * 3, 1, date('Y', $quarter)));
			$tempDate = $temp['endDate'];
			$returnData[] = $temp;
			$i = $i + 3;
		}
	} elseif ($type == 'year') {    // 查询所有年份以及开始结束时间
		while (strtotime($tempDate) < strtotime($endDate)) {
			$temp = [];
			$year = strtotime('+' . $i . ' year', strtotime($startDate));
			$temp['name'] = date('Y', $year) . '年';
			$temp['startDate'] = date('Y-01-01', $year);
			$temp['endDate'] = date('Y-12-31', $year);
			$tempDate = $temp['endDate'];
			$returnData[] = $temp;
			$i++;
		}
	}
	return $returnData;
}
getDate('2025-01-01','2025-02-01','day')

生成N位随机数

php 复制代码
function rand($n = 10) {
	$metas = range(0, 9);
	$metas = array_merge($metas, range('A', 'Z'));
	$metas = array_merge($metas, range('a', 'z'));
	$str = '';
	for ($i = 0; $i < $n; $i++) {
		$str .= $metas[rand(0, count($metas) - 1)];
	}
	return $str;
}
rand(5)

格式化小数

php 复制代码
/**
 * @param float $num 小数
 * @param int $decimal 保留小数位数
 * @return string
 */
function format($num = 0,$decimal = 2){
	return $num ? sprintf("%.".$decimal."f",$num):'0.00';
}

format(3.655)

银行卡号格式化

银行卡号每4位加空格,13到16位用*表示

php 复制代码
function strreplace($str, $startlen = 12, $endlen = 3) {
	$repstr = "";
	if (strlen($str) < ($startlen + $endlen + 1)) {
		return $str;
	}
	$count = strlen($str) - $startlen - $endlen;
	for ($i = 0; $i < $count; $i++) {
		$repstr .= "*";
	}
	$str = preg_replace('/(\d{' . $startlen . '})\d+(\d{' . $endlen . '})/', '${1}' . $repstr . '${2}', $str);
	$ns = [4, 9, 14, 19];
	for ($i = 0; $i < 4; $i++) {
		$str = str_insert($str, $ns[$i], ' ');
	}
	return $str;
}
//字符中插入字符串方法 
function str_insert($str, $i, $substr) {
	$startstr = '';
	$laststr = '';
	for ($j = 0; $j < $i; $j++) {
		$startstr .= $str[$j];
	}
	for ($j = $i; $j < strlen($str); $j++) {
		$laststr .= $str[$j];
	}
	$str = ($startstr . $substr . $laststr);
	return $str;
}
strreplace('6212345678901234');

生成邀请码

php 复制代码
/**
 * 根据用户ID生成邀请码
 * @param $userId
 * @return string
 */
function getInviteCode($userId)
{
	$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
	$num = strlen($chars);
	$str = '';
	while ($userId > 0) {
		$mod = $userId % $num;
		$userId = ($userId - $mod) / $num;
		$str = $chars[$mod] . $str;
	}
	// 不足用随机字符串补充,10表示邀请码邀请10位
	$str = str_pad($str, 10, createNonceStr(10 - strlen($str)), STR_PAD_LEFT);
	return $str;
}
function createNonceStr($length = 16)
{
	$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
	$str = '';
	for ($i = 0; $i < $length; $i++) {
		$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
	}
	return $str;
}

给字符串加密解密并自定义加密位数

(例如:给ID加密到展示N位字符串,也可用于邀请码)

php 复制代码
    function alphaID($in, $to_num = false, $pad_up = false, $passKey = null)
    {
        $key = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $i = 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','0','1','2','3','4','5','6','7','8','9','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');
        if ($passKey !== null) {
            $len = strlen($key);
            $passhash = hash('sha256',$passKey);
            $passhash = (strlen($passhash) < $len) ? hash('sha512',$passKey) : $passhash;
            for ($n=0; $n < $len; $n++) {
                $p[] = substr($passhash, $n ,1);
            }
            array_multisort($p, SORT_DESC, $i);
            $key = implode($i);
        }
        $base = strlen($key);
        if ($to_num) {
            $in = strrev($in);
            $out = 0;
            $len = strlen($in) - 1;
            for ($t = 0; $t <= $len; $t++) {
                $bcpow = bcpow($base, $len - $t);
                $out = $out + strpos($key, substr($in, $t, 1)) * $bcpow;
            }
            if (is_numeric($pad_up)) {
                $pad_up--;
                if ($pad_up > 0) {
                    $out -= pow($base, $pad_up);
                }
            }
        } else {
            if (is_numeric($pad_up)) {
                $pad_up--;
                if ($pad_up > 0) {
                    $in += pow($base, $pad_up);
                }
            }
            $out = "";
            for ($t = floor(log10($in) / log10($base)); $t >= 0; $t--) {
                $a = floor($in / bcpow($base, $t));
                $out = $out . substr($key, $a, 1);
                $in = $in - ($a * bcpow($base, $t));
            }
            $out = strrev($out); // reverse
        }
        return $out;
    }
//加密到8位数
alphaID(【要加密的数据】,true,8);
//调用解密
alphaID(【要解密的数据】,false,8);

自定义日志封装方法

(主要用于日志写入)

php 复制代码
function logCustomMessage($message = '', $level = 'INFO',$path = '/logs/gongpai/') {
    // 拼接日志目录路径
    $logPath = APPPATH . $path;
    if (!is_dir($logPath)) {
        mkdir($logPath, 0777, true);
    }
    // 构造日志内容
    $timestamp = date('Y-m-d H:i:s');
    $logEntry = "[$timestamp] [$level] $message\n";
    file_put_contents($logPath . date('Y-m-d').'.log', $logEntry, FILE_APPEND);
    return true;
}

//调用方法
logCustomMessage("debug", '错误----提示:'.json_encode([],JSON_UNESCAPED_UNICODE));
相关推荐
BingoGo1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack4 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
QQ5110082855 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
WeiXin_DZbishe5 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5