常用功能的自定义函数集合

<?php
/**
 * AJAX方式返回数据到客户端
 *
 * @param mixed $data 要返回的数据
 * @return void
 */
function ajax_return($data)
{
    header('Content-Type:application/json; charset=utf-8');
    echo json_encode($data);
    exit();
}

/**
 * 将二维数组按指定字段排序
 *
 * @param array $arr 需要排序的二维数组
 * @param string $key 排序字段名
 * @param int $order 排序方式,可选值:SORT_DESC|SORT_ASC
 * @return array 排序后的二维数组
 */
function array_ksort($arr, $key, $order = SORT_DESC)
{
    $keyCol = array_column($arr, $key);
    array_multisort($keyCol, $order, $arr);
    return $arr;
}

/**
 * 把数组转成XML字符串
 *
 * @param array $arr 数组
 * @return string XML字符串
 */
function array_to_xml($arr)
{
    if (!is_array($arr) || count($arr) == 0) return '';

    $xml = "<xml>";
    foreach ($arr as $key => $val) {
        if (is_numeric($val)) {
            $xml .= "<{$key}>{$val}</{$key}>";
        } else {
            $xml .= "<{$key}><![CDATA[{$val}]]></{$key}>";
        }
    }
    $xml .= "</xml>";

    return $xml;
}

/**
 * 获取当前页面URL
 *
 * @return string 当前页面URL
 */
function get_current_url()
{
    return "{$_SERVER['REQUEST_SCHEME']}://{$_SERVER['SERVER_NAME']}{$_SERVER['REQUEST_URI']}";
}

/**
 * 获取文件的MIME类型
 * 备注:本函数同时支持获取本地文件或远程文件的MIME类型。
 * 备注:本函数依赖fileinfo扩展,使用前请确保该扩展已加载。
 *
 * @param string $file 本地文件硬盘路径或远程文件URL
 * @return string 文件的MIME类型(若文件不存在则返回NULL),示例:text/x-php、image/png
 */
function get_mime($file)
{
    $mime = null;

    if (file_exists($file)) {
        $finfo = new finfo(FILEINFO_MIME_TYPE);

        $mime = $finfo->file($file);
    } else {
        $curl = curl_init($file);

        curl_setopt($curl, CURLOPT_NOBODY, true); // 设置不需要取回消息体

        if (curl_exec($curl) !== false) {
            $mime = curl_getinfo($curl, CURLINFO_CONTENT_TYPE);
        }

        curl_close($curl);
    }

    return $mime;
}

/**
 * 获取随机字符串
 *
 * @param int $length 字符串长度
 * @return string 随机字符串
 */
function get_rand_string($length)
{
    $chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';

    return substr(str_shuffle($chars), 0, $length);
}

/**
 * 解析URL携带的参数
 * 备注:若不指定$key则返回URL里的全部参数。
 *
 * @param string $url 要解析参数的URL
 * @param string $key 指定参数名,若参数不存在则结果返回NULL
 * @return mixed 解析结果
 */
function get_url_query($url, $key = '')
{
    $param = [];

    $parse = (array)parse_url($url);

    parse_str($parse['query'], $param);

    if ($key) {
        return $param[$key] ?? null;
    }

    return $param;
}

/**
 * 十六进制颜色值转RGB颜色值
 *
 * @param string $color 十六进制颜色值(不区分大小写),如:#f00、#cCE8cf
 * @return false RGB颜色值,如十六进制颜色值不合法则返回FALSE
 */
function hex2rgb($color)
{
    $hexColor = str_replace('#', '', $color);

    $len = strlen($hexColor);
    if ($len != 3 && $len != 6) {
        return false;
    }

    // 检查是否是合法的十六进制颜色值
    if (!preg_match('/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/is', $color)) {
        return false;
    }

    $newColor = '';
    if ($len == 3) {
        for ($i = 0; $i < $len; $i++) {
            $newColor .= $hexColor[$i] . $hexColor[$i];
        }
    } else {
        $newColor = $hexColor;
    }

    $hex = str_split($newColor, 2);

    $rgb = [];
    foreach ($hex as $key => $value) {
        $rgb[] = hexdec($value);
    }

    return $rgb;
}

/**
 * POST方式请求资源
 *
 * @param string $url 请求的URL
 * @param mixed $data 请求时携带的参数(数组键值对形式或XML字符串形式等等皆可)
 * @param string $sslcert SSLCERT文件路径,如:/important/ssl/apiclient_cert.pem
 * @param string $sslkey SSLKEY文件路径,如:/important/ssl/apiclient_key.pem
 * @return string 返回的內容
 */
function http_post($url, $data, $sslcert = '', $sslkey = '')
{
    $data = is_array($data) ? http_build_query($data) : $data; // 如果携带的参数是数组需要额外处理一下

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_URL, $url);

    if ($sslcert && $sslkey) {
        curl_setopt($ch, CURLOPT_SSLCERT, $sslcert);
        curl_setopt($ch, CURLOPT_SSLKEY, $sslkey);
    }

    $response = curl_exec($ch);

    curl_close($ch);

    return $response;
}

/**
 * 将图片转成base64编码
 *
 * @param string $img 图片磁盘路径
 * @return string 图片base64编码
 */
function img_to_base64($img)
{
    if (!file_exists($img)) {
        return '';
    }

    $contents = file_get_contents($img);
    $type = mime_content_type($img); // 获取图片格式,示例:image/png、image/jpeg
    $base64 = chunk_split(base64_encode($contents));

    return "data:{$type};base64,{$base64}";
}

/**
 * 正整数位数不足左侧补零
 *
 * @param int $int 正整数
 * @param int $length 位数
 * @return string 左侧补零正整数
 */
function int_pad($int, $length)
{
    return sprintf("%0{$length}d", $int);
}

/**
 * 检查十六进制颜色值是否合法
 *
 * @param string $color 十六进制颜色值(不区分大小写),如:#f93、#ff9933
 * @return bool 检查结果
 */
function is_color($color)
{
    return preg_match('/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/is', $color);
}

/**
 * 检查邮箱地址格式是否正确
 *
 * @param string $email 邮箱地址
 * @return bool 检查结果
 */
function is_email($email)
{
    $result = filter_var($email, FILTER_VALIDATE_EMAIL);
    return $result === FALSE ? FALSE : TRUE;
}

/**
 * 检查手机号码格式是否正确
 *
 * @param string $mobile 手机号码
 * @return bool 检查结果
 */
function is_mobile($mobile)
{
    return strlen($mobile) == 11 && preg_match("/(13\d|14[579]|15[^4\D]|17[^49\D]|18\d)\d{8}/", $mobile);
}

/**
 * 检查一个数字是否为正整数
 * 备注:必须是十进制正整数,且不能以0开头
 *
 * @param int $int 一个数字
 * @return bool 检查结果
 */
function is_positive_int($int)
{
    return preg_match('/^[1-9]\d*$/', $int);
}

/**
 * 检查一串字符是否为邮政编码
 *
 * @param string $str 邮政编码
 * @return bool 检查结果
 */
function is_postal_code($str)
{
    return preg_match('/^[1-9]\d{5}/', $str);
}

/**
 * 检查QQ号码格式是否正确
 *
 * @param string $qq QQ号码
 * @return bool 检查结果
 */
function is_qq($qq)
{
    return preg_match("/^[1-9][0-9]{4,}$/", $qq);
}

/**
 * 检查远程文件是否存在
 *
 * @param string $url 远程文件URL
 * @return bool 检查结果
 */
function is_remote_file_exists($url)
{
    $isExist = FALSE; // 默认文件不存在

    $curl = curl_init($url);

    curl_setopt($curl, CURLOPT_NOBODY, TRUE); // 设置不需要取回消息体

    $response = curl_exec($curl); // 发送请求
    if ($response !== FALSE) {
        // 如果HTTP状态码为200则说明远程文件存在
        $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        if ($httpCode == 200) $isExist = TRUE;
    }

    curl_close($curl);

    return $isExist;
}

/**
 * 检查session是否已经启动
 * 温馨提示:如果检测到session尚未启动最好先使用session_start()将其启动后再操作$_SESSION变量
 *
 * @return bool 检查结果
 */
function is_session_start()
{
    return session_status() === PHP_SESSION_ACTIVE;
}

/**
 * 检查固定电话格式是否正确
 * 备注:国内固定电话由三部分构成,分别是当地区号、分隔符和具体号码,即:0000-0000000
 *       ①当地区号:以数字0开头,后面跟2~3个数字
 *       ②分隔符:规定使用“-”
 *       ③具体号码:由7~8个数字组成
 *
 * @param string $telephone 固定电话
 * @return bool 检查结果
 */
function is_telephone($telephone)
{
    return preg_match("/^0\d{2,3}-\d{7,8}$/", $telephone);
}

/**
 * 检查URL格式是否正确
 *
 * @param string $url URL
 * @return bool 检查结果
 */
function is_url($url)
{
    $result = filter_var($url, FILTER_VALIDATE_URL);
    return $result === FALSE ? FALSE : TRUE;
}

/**
 * 检查访问设备是否是微信浏览器
 *
 * @return bool 检查结果
 */
function is_weixin_browser()
{
    $httpUserAgent = $_SERVER['HTTP_USER_AGENT'];

    $result = strpos($httpUserAgent, 'MicroMessenger');

    return $result === FALSE ? FALSE : TRUE;
}

/**
 * 跳转到指定URL页面
 *
 * @param string $url 指定URL
 * @return void
 */
function location($url)
{
    header("Location: {$url}");
    exit();
}

/**
 * 新建目录
 *
 * @param string $dir 目录路径
 * @return bool 新建目录结果
 */
function mk_dir($dir)
{
    if (is_dir($dir)) return TRUE;
    return mkdir($dir, 0755, TRUE);
}

/**
 * 获得毫秒时间戳(13位数字串)
 *
 * @return int 毫秒时间戳(13位数字串)
 */
function ms_time()
{
    list($usec, $sec) = explode(' ', microtime());
    return $sec . substr(strval($usec), 2, 3);
}

/**
 * 把对象转成数组形式
 *
 * @param object $object 对象
 * @return array 数组
 */
function object_to_array($object)
{
    return json_decode(json_encode($object), TRUE);
}

/**
 * 使用print_r()打印变量
 *
 * @param mixed $var 任意变量
 * @param bool $exit 打印变量后是否执行exit()
 * @return void
 */
function p(mixed $var, bool $exit = true): void
{
    echo '<pre>' . PHP_EOL . print_r($var, true) . '</pre>';

    if ($exit === true) {
        exit();
    }
}

/**
 * 移除左右两端的空白字符
 * 备注:空白字符包括制表符、回车、半角空格、全角空格等。
 *
 * @param mixed $var 要处理的内容,支持单个字符串或一维数组
 * @return mixed
 */
function trim_space($var)
{
    $arr = is_array($var) ? $var : array($var);

    $arr = array_map('trim', $arr); // 对所有数组元素应用trim()函数

    array_walk($arr, function (&$value) {
        $value = trim($value, ' ');
    }); // 处理连续全角空格

    return is_array($var) ? $arr : $arr[0];
}

/**
 * 获得微秒时间戳(16位数字串)
 *
 * @return int 微秒时间戳(16位数字串)
 */
function us_time()
{
    list($usec, $sec) = explode(' ', microtime());
    return $sec . substr(strval($usec), 2, 6);
}

/**
 * 使用var_dump()打印变量
 *
 * @param mixed $var 任意变量
 * @param bool $exit 打印变量后是否执行exit()
 * @return void
 */
function v(mixed $var, bool $exit = true): void
{
    ob_start();
    var_dump($var);
    $output = ob_get_clean();

    echo '<pre>' . PHP_EOL . $output . '</pre>';

    if ($exit === true) {
        exit();
    }
}

/**
 * 把XML字符串转成数组形式
 *
 * @param string $xml XML字符串
 * @return array 数组
 */
function xml_to_array($xml)
{
    // 先把XML字符串转成SimpleXMLElement对象
    $obj = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);

    // 把对象转成数组
    return json_decode(json_encode($obj), TRUE);
}

/**
 * 把XML字符串转成对象形式
 *
 * @param string $xml XML字符串
 * @return object 对象
 */
function xml_to_object($xml)
{
    return simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
}

Copyright © 2024 码农人生. All Rights Reserved