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));
相关推荐
Johnstons2 小时前
游戏网络测试怎么做?从延迟到丢包,一套完整的游戏弱网测试方案
网络·游戏·php
楷哥爱开发6 小时前
降低网络爬虫成本:基础设施优化指南
服务器·开发语言·php
两个人的幸福13 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
BingoGo15 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack15 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户30745969820716 天前
PHP 扩展——从入门到理解
php
鹏仔先生17 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下17 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
xingpanvip17 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
酉鬼女又兒17 天前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php