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));
相关推荐
slongzhang_2 小时前
PHP图片处理|画布入门
开发语言·php
知码者2 小时前
对于Thinkphp5可能遇到的保存问题
服务器·php·apache·小程序开发·跨平台小程序
郑州光合科技余经理3 小时前
实战分享:如何构建东南亚高并发跑腿配送系统
java·开发语言·javascript·spring cloud·uni-app·c#·php
云云只是个程序马喽3 小时前
海外短剧系统开发核心功能设计及上线材料准备
小程序·php
一往无前fgs4 小时前
PHP语言开发基础入门实践教程(零基础版)
开发语言·php
步步为营DotNet5 小时前
深度剖析.NET中HttpClient的请求重试机制:可靠性提升与实践优化
开发语言·php·.net
JaguarJack5 小时前
再推荐 10 个低调但非常实用的 PHP 包
后端·php
BingoGo6 小时前
再推荐 10 个低调但非常实用的 PHP 包
后端·php
ljh57464911916 小时前
PhpStorm 2022.3 版本中,修改使用 Git 提交时看到弹出式的对话框模式
ide·git·php·phpstorm