PHP常用方法封装

发布时间:2026/5/19 9:45:02

PHP常用方法封装 CI框架封装POST/** * 存在并不为空 */ function is_exist($param) { return isset($param) $param; } /** * 批量安全获取 POST 参数 * param array|string $fields 字段名字符串 / 一维数组 / 二维数组 [字段, 默认值] * param string $default 全局默认值仅一维数组/字符串生效 * param bool $is_multi_dimensional 是否启用二维数组模式 * return array|string */ function post_params($fields, $default , $is_multi_dimensional false) { $ci get_instance(); // 如果是字符串直接返回单个参数 if (!is_array($fields)) { $value $ci-input-post($fields, true); return is_exist($value) ? $value : $default; } $result []; if ($is_multi_dimensional) { // 二维格式[ [name,默认值], [age,默认值] ] foreach ($fields as $item) { $field is_exist($item[0]) ? $item[0] : ; $def is_exist($item[1]) ? $item[1] : $default; if ($field) { $value $ci-input-post($field, true); $result[$field] is_exist($value) ? $value : $def; } } } else { // 一维格式[name,age,tel] foreach ($fields as $field) { $value $ci-input-post($field, true); $result[$field] is_exist($value) ? $value : $default; } } return $result; } var_dump(post_params(参数名,默认值)); var_dump(post_params([参数名,参数名1,参数名2],默认值)); var_dump(post_params([ [参数名,默认值], [参数名,默认值], ],默认值,true));拆分utf-8格式的字符串function utf8_str_split($str, $split_len 1) { if (!preg_match(/^[0-9]$/, $split_len) || $split_len 1) return FALSE; $len mb_strlen($str, UTF-8); if ($len $split_len) return array($str); preg_match_all(/.{ . $split_len . }|[^\\x00]{1, . $split_len . }$/us, $str, $ar); return $ar[0]; } var_dump(utf8_str_split(中国加油));封装Response返回参数if (!function_exists(json)) { /** * Json response * param $data * param int $options * return Response */ function json($data, int $options JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_THROW_ON_ERROR): Response { return new Response(200, [Content-Type application/json], json_encode($data, $options)); } } function success($msg, $data [],$count 0,$code 200) { return json([ code $code ?: 200, msg $msg ?: 操作成功, result $data ?: [], count $count ?: 0, type success, ],JSON_UNESCAPED_UNICODE); } var_dump(success()); function error($msg, $data [],$count 0,$code 400) { return json([ code $code ?: 400, msg $msg ?: 操作失败, result $data ?: [], count $count ?: 0, type error, ],JSON_UNESCAPED_UNICODE); } var_dump(error());对指定时间内的周一到周末进行分组// 定义常量必须在顶层作用域 const MONDAY Mon; const TUESDAY Tue; const WEDNESDAY Wed; const THURSDAY Thu; const FRIDAY Fri; const SATURDAY Sat; const SUNDAY Sun; function Yeardays($dateStart, $dateEnd) { $period new \DatePeriod( new \DateTime($dateStart), new \DateInterval(P1D), (new \DateTime($dateEnd))-modify(1 day) // 包含结束日期 ); $dates iterator_to_array($period); // 使用常量作为数组键必须在顶层定义 $arrayReturn [ MONDAY [], TUESDAY [], WEDNESDAY [], THURSDAY [], FRIDAY [], SATURDAY [], SUNDAY [] ]; foreach ($dates as $val) { $date $val-format(Y-m-d); $dayName $val-format(D); // 直接获取3字母星期 $arrayReturn[$dayName][] $date; } return $arrayReturn; } var_dump(Yeardays(2020-07-01, 2020-07-31));数组与对象之间的转换//对象转数组 function object_array($object) { $object (array)$object; foreach ($object as $k $v) { if (gettype($v) resource) { return []; } if (gettype($v) object || gettype($v) array) { $object[$k] (array)object_array($v); } } return $object; } //数组转对象 function array_object($array) { if (gettype($array) ! array) { return (object)[]; } foreach ($array as $k $v) { if (gettype($v) array || getType($v) object) { $array[$k] (object)array_object($v); } } return (object)$array; }通过身份证号获取生日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 ; } var_dump(get_birthday(‌11010519900307777X));获取访问者的IPfunction getIp(){ 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); } var_dump(getIp()); function getRealIp() { static $realip null; if ($realip ! null) { return $realip; } if (isset($_SERVER)) { if (isset($_SERVER[HTTP_X_FORWARDED_FOR])) { //但如果客户端是使用代理服务器来访问那取到的就是代理服务器的 IP 地址而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址就要使用 $_SERVER[HTTP_X_FORWARDED_FOR] 来读取。 $arr explode(,, $_SERVER[HTTP_X_FORWARDED_FOR]); /* 取X-Forwarded-For中第一个非unknown的有效IP字符串 */ foreach ($arr as $ip) { $ip trim($ip); if ($ip ! unknown) { $realip $ip; break; } } } elseif (isset($_SERVER[HTTP_CLIENT_IP])) { //HTTP_CLIENT_IP 是代理服务器发送的HTTP头。如果是超级匿名代理则返回none值。同样REMOTE_ADDR也会被替换为这个代理服务器的IP。 $realip $_SERVER[HTTP_CLIENT_IP]; } else { if (isset($_SERVER[REMOTE_ADDR])) { //正在浏览当前页面用户的 IP 地址 $realip $_SERVER[REMOTE_ADDR]; } else { $realip 0.0.0.0; } } } else { //getenv环境变量的值 if (getenv(HTTP_X_FORWARDED_FOR)) { //但如果客户端是使用代理服务器来访问那取到的就是代理服务器的 IP 地址而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址 $realip getenv(HTTP_X_FORWARDED_FOR); } elseif (getenv(HTTP_CLIENT_IP)) { //获取客户端IP $realip getenv(HTTP_CLIENT_IP); } else { $realip getenv(REMOTE_ADDR); //正在浏览当前页面用户的 IP 地址 } } preg_match(/[\d\.]{7,15}/, $realip, $onlineip); $realip !empty($onlineip[0]) ? $onlineip[0] : 0.0.0.0; return $realip; } var_dump(getRealIp());对二维数组进行排序/** * 对二维数组进行排序 * 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; } $list [ [name Alice, age 30], [name Bob, age 25], [name Charlie, age 35] ]; var_dump(list_sort_by($list, name, asc));//按照数组里的name进行排序获取指定时间内日期、月份、季度、年份/** * 查询指定时间范围内的所有 日期月份季度年份 * 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; } var_dump(getDate(2025-01-01,2025-02-01,day));生成N位随机数function setRand($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; } var_dump(setRand(5));格式化小数/** * param float|int $num 输入数值 * param int $decimal 保留小数位数默认为2 * return string 格式化后的字符串截断保留指定位数不足位补零 */ function format(float|int $num 0, int $decimal 2): string { // 处理负小数位数 $decimal max($decimal, 0); $factor 10 ** $decimal; // 向零取整截断兼容负数 $truncated ($num 0) ? floor($num * $factor) : ceil($num * $factor); // 分离整数和小数部分 $absValue abs($truncated); $integerPart (int)($absValue / $factor); $fractionPart $absValue % $factor; // 处理小数位数为0的情况 if ($decimal 0) { return ($truncated 0 ? - : ) . $integerPart; } // 小数部分补零 $fractionStr str_pad((string)$fractionPart, $decimal, 0, STR_PAD_LEFT); $result $integerPart . . . $fractionStr; // 添加负号 if ($truncated 0) { $result - . $result; } return $result; } // 测试用例 var_dump(format(3.6554)); // 3.65截断非四舍五入 var_dump(format(-2.999, 2)); // -2.99 var_dump(format(5.1, 4)); // 5.1000 var_dump(format(0)); // 0.00 var_dump(format(-0.001, 2)); // 0.00负零处理 var_dump(format(100.456, 0)); // 100银行卡号格式化银行卡号每4位加空格13到16位用*表示//字符中插入字符串方法 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; } //银行卡号格式化 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; } var_dump(strreplace(6212345678901234));生成邀请码/** * 根据用户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; } var_dump(getInviteCode(1));给字符串加密解密并自定义加密位数(例如给ID加密到展示N位字符串也可用于邀请码)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 ($n0; $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位数 $miId alphaID(123,true,8); var_dump($miId); //调用解密 $jiemiId alphaID($miId,false,8); var_dump($jiemiId);自定义日志封装方法(主要用于日志写入)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));

相关新闻