PHP常用函数库整理

一、xml类型数据转成Array类型 

提示:可以使用PHP的内置函数simplexml_load_string()将xml格式类型的数据转换成object(对象)

coding:

<?php

/**
 * xml转array
 * @param  $xml   需要转换的xml数据
 * @return array  返回将xml转换后的数组
 * */
function xmlToArray($xml)
{
    //禁止引用外部xml实体
    libxml_disable_entity_loader(true);
    $values = json_decode(json_encode(simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA)),true);
    return $values;
}

?>

看到这种方式大家是不是恍然大悟。。 根本不需要各种for循环或者foreach循环。。


方式二(正则+递归的方式):

function xml_to_array($xml)
{
    $reg = "/<(\\w+)[^>]*?>([\\x00-\\xFF]*?)<\\/\\1>/";

    if(preg_match_all($reg, $xml, $matches))
    {
        $count = count($matches[0]);
        $arr = array();

        for($i = 0; $i < $count; $i++)
        {
            $key = $matches[1][$i];
            $val = xml_to_array( $matches[2][$i] ); //递归

            if(array_key_exists($key, $arr))
            {
                if(is_array($arr[$key]))
                {
                    if(!array_key_exists(0,$arr[$key]))
                    {
                        $arr[$key] = array($arr[$key]);
                    }
                }
                else
                {
                    $arr[$key] = array($arr[$key]);
                }
                $arr[$key][] = $val;
            }
            else
            {
                $arr[$key] = $val;
            }
        }
        return $arr;
    }
    else
    {
        return $xml;
    }
}


二、删除指定目录下的所有文件

经常需要删除指定目录下的文件,今天给封装了一个函数 记录下来 以后就直接拿来用了。。注意用到了PHP中的opendir()以及readdir()等函数

coding:

/**
 * 删除指定目录下的所有文件
 * @param  string  $dir 目录路径
 * @return bool
 * */
function delDirFile($dir)
{
    if(!is_dir($dir)) return false;

    $resource = opendir($dir);  //打开一个目录  

    while($file = readdir($resource))  
    {
        if($file != "." && $file != "..")
        {
            $fullpath = $dir.'/'.$file; //将当前传进来的目录以及读取到的当前文件进行拼接  

            if(!is_dir($fullpath)) //拼接后的$fullpath不是一个目录,则是文件,则删除当前文件
            {
                unlink($fullpath);
            }
        }
    }
}


三、计算两个日期之间相差多少天

这个也是挺常用的,比如说查看当前日期与某个用户的会员到期日期 还有几天。

coding:

/**计算两个日期之间的相差的天数
 * @param  int   $dateone  日期1(时间戳)
 * @param  int   $datetwo  日期2(时间戳)
 * @return float $days     相差之后的天数
 * */
function get_diff_date($dateone,$datetwo)
{
    $days = round( ($dateone - $datetwo) / 3600 / 24);

    return $days;
}


四、获取指定月份的第一天以及最后一天

coding:

/**获取指定月份的起始时间以及月份的最后一天
 * @param  string  $date //指定月份
 * @return array   返回指定月份的第一天以及最后一天
 * */
function get_month($date)
{
    $firstday = date('Y-m-01', strtotime($date)); //月初

    $lastday = date('Y-m-d', strtotime("$firstday +1 month -1 day"));//月末

    return array($firstday, $lastday);
}

//使用方法如下:
$date = '2018-02';
var_dump(get_month($date));

/*
  array (size=2)
  0 => string '2018-02-01' (length=10)
  1 => string '2018-02-28' (length=10)
*/


五、获取客户端访问者用户IP地址

coding:

/**
 * 获得客户端用户IP
 * @return string
 * @author Dacheng Chen(博主的一位女同事)
 * 
 * 一般做方可计数器时,大多都會利用PHP的$SERVER['REMOTE_ADDR']來抓取访客的IP地址,
 可是在书上发现REMOTE_ADDR不能抓取到有经过proxy(代理服务器)访客的真实IP,
 所以搭配利用$SERVER['HTTP_X_FORWARDED_FOR'],它可以将所有访客主机经过的代理主机IP记录下来,便可以抓到有经过proxy访客的真实IP。
 * 注意:以上这段解释不是本函数的作者写的  是博主自己写的。
 */

function get_user_ip()
{
    if(empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
    {
        $ip_address = $_SERVER["REMOTE_ADDR"];
    }
    else
    {
        $ip_address = $_SERVER["HTTP_X_FORWARDED_FOR"];
    }

    if(strpos($ip_address,',') !== false)
    {
        $ip_address = explode(',', $ip_address);
        $ip_address = $ip_address[0];
    }

    return $ip_address;
}


六、计算字符串的长度(包括中英数字混合情况)

coding:

/**
 * 计算字符串的长度(包括中英数字混合情况)
 *
 * @param   type $str
 * @return  int
 * @desc    zdm 非博主个人写的 以前company写好的
 */
function count_string_len($str)
{
    $name_len = strlen($str);
    $temp_len = 0;

    for($i = 0; $i < $name_len;)
    {
        if(strpos('abcdefghijklmnopqrstvuwxyz0123456789ABCDEFGHIJKLMNOPQRSTVUWXYZ_-', $str [$i]) === false)
        {
            $i = $i + 3;
            $temp_len += 2;
        }
        else
        {
            $i = $i + 1;
            $temp_len += 1;
        }
    }

    return $temp_len;
}


七、截取utf8编码字符串(包含中英文混合字符串)

coding:

/**
 * 截取UTF8编码字符串从首字节开始指定宽度(非长度), 适用于字符串长度有限的如新闻标题的等宽度截取
 * 中英文混排情况较理想. 全中文与全英文截取后对比显示宽度差异最大,且截取宽度远大越明显.
 * @param string $str   UTF-8 encoding
 * @param int[option] $width 截取宽度
 * @param string[option] $end 被截取后追加的尾字符
 * @param float[option] $x3<p>
 *  3字节(中文)字符相当于希腊字母宽度的系数coefficient(小数)
 *  中文通常固定用宋体,根据ascii字符字体宽度设定,不同浏览器可能会有不同显示效果</p>
 *
 * @return string
 * @author waiting
 * http://waiting.iteye.com
 * @desc zdm 非博主个人写的 以前company写好的
 */
function utf_substr($str, $width = 0,$end = '...',$x3 = 0)
{
    global $CFGX3; // 全局变量保存 x3 的值

    if ($width <= 0 || $width >= strlen($str))
    {
        return $str;
    }

    $e   = '';
    $arr = str_split($str);
    $len = count($arr);
    $w   = 0;
    $width *= 10;

    // 不同字节编码字符宽度系数
    $x1 = 11;   // ASCII
    $x2 = 16;
    $x3 = $x3 === 0 ? ( $CFGX3['cf3'] > 0 ? $CFGX3['cf3'] * 10 : $x3 = 21 ) : $x3 * 10;
    $x4 = $x3;

    // http://zh.wikipedia.org/zh-cn/UTF8
    for($i = 0; $i < $len; $i++)
    {
        if ($w >= $width)
        {
            $e = $end;
            break;
        }
        $c = ord($arr[$i]);
        if ($c <= 127)
        {
            $w += $x1;
        }
        elseif($c >= 192 && $c <= 223)
        {
            // 2字节头
            $w += $x2;
            $i += 1;
        }
        elseif($c >= 224 && $c <= 239)
        {
            // 3字节头
            $w += $x3;
            $i += 2;
        }
        elseif($c >= 240 && $c <= 247)
        {
            // 4字节头
            $w += $x4;
            $i += 3;
        }
    }

    return implode('',array_slice($arr, 0, $i)).$e;
}


八、将数组插入指定数组的位置中(二维)

coding:

/**
 * 将数组插入指定数组的位置中(二维)
 * @param  array $array       给哪个数组插入(二维)
 * @param  int   $position    在那个位置插入
 * @param  array $insert_aray 要插入的数组(二维)
 * @return array
 * @author 
 * @desc   zdm 非博主个人写的 以前同事写好的
 * @ 利用array_merge合并函数,合并的数组key是索引的特性以及array_splice函数将数组中指定位置的数组移除并返回移除的数组,
  *  注意:array_splice函数的第一个参数是引用传址,所以下面这个方法才好用~
 */
function array_insert($array,$position,$insert_array)
{
    $find_array = array_splice($array,0,$position);
    $array      = array_merge($find_array,$insert_array,$array); 

    return $array;
}

以上函数只测试过二维数组

//调用示例:
$this->array_insert($banner_list,1,[$advert[0]]); //向$banner_list数组中的第2个位置插入$advert数组


九、获取两个日期之间的所有日期

函数简介:

有时候我们想得到两个日期之间的所有日期

例如:

输入两个日期,把这两个日期之间的所有日期取出来   

如果是:2019-02-01至2019-02-05(同为一个月)   

则为:2019-02-01,2019-02-02,2019-02-03,2019-02-04,2019-02-05   

如果是:2019-02-26至2019-03-02(不同的月,有31号的月份)   

则为:2019-02-26,2019-02-27,2019-02-28,2019-03-01,2019-03-02

coding:

/**
 * @param  string $start_date 开始日期
 * @param  string $end_date   结束日期
 * @return array              返回两个日期之间的间隔日期数组
 */
function get_diff_date($start_date,$end_date)
{
    $result = array();

    $dt_start = strtotime($start_date);
    $dt_end   = strtotime($end_date);

    while ($dt_start <= $dt_end)
    {
        $result[] = date('Y-m-d', $dt_start);

        $dt_start = strtotime('+1 day', $dt_start);
    }

    return $result;
}

$res = get_diff_date('2009-02-26','2009-03-03');

var_dump($res);exit;

可参考:https://www.cnblogs.com/kccdzz/p/6685181.html


十、删除指定目录的文件夹以及文件夹下的所有文件

/**
 * 递归删除指定目录的文件夹以及文件夹下所有文件
 * @author wzyl
 * @date   2017-09-03 13:00
 * @param  string  $dir 删除路径
 * @return boolean      成功返回true  失败返回false
 */
function remove_dir($dir)
{
    if(is_dir($dir))
    {
        $o = opendir($dir); //是路径所以才打开

        //循环遍历文件
        while($file = readdir($o))
        {
            if($file != "." && $file != "..")
            {
                //判断当前文件是目录还是文件(必须是完整路径),如果当前目录是文件,则直接删除文件
                if(!is_dir($dir.'/'.$file))
                {
                    unlink($dir.'/'.$file);
                }
                else
                {
                    //当前目录不是文件 而是一个目录 则递归进行处理
                    remove_dir($dir.'/'.$file);
                }
            }
        }

        closedir($o);

        //删除文件夹
        @rmdir($dir);
    }

    return true;
}

//调用示例
var_dump('D:\runtime');  //runtime目录及目录下的所有文件和文件夹都会被删除


十一、将数组中指定的key按照指定字符截取,并将截取后的结果追加一个新的key保存

/**
 * 将数组中指定的key按照指定字符截取,并将截取后的结果追加一个新的key保存
 * @params array  $arr       二维数组
 * @params string $sub_key   截取数组中的哪个key
 * @params string $character 指定key中的字符截取
 * @return array
 */
function sub_arr_append($arr, $sub_key, $character = '_')
{
    if(empty($arr)) return array();

    foreach($arr as $key => $val)
    {
        $arr[$key]['new_key'] = substr($val[$sub_key], strpos($val[$sub_key], $character) + 1);
    }

    return $arr;
}

//调用示例
$arr = array(
    0 => array('id' => 61, 'chat_id' => 10, 'to_id' => 'md_1159', 'content' => '123'),
    1 => array('id' => 61, 'chat_id' => 10, 'to_id' => 'md_52', 'content' => '789')
);

var_dump(sub_arr_append($arr, 'to_id'));

//输出结果如下:
array (size=2)
  0 => 
    array (size=5)
      'id' => int 61
      'chat_id' => int 10
      'to_id' => string 'md_1159' (length=7)
      'content' => string '123' (length=3)
      'new_key' => string '1159' (length=4)
  1 => 
    array (size=5)
      'id' => int 61
      'chat_id' => int 10
      'to_id' => string 'md_52' (length=5)
      'content' => string '789' (length=3)
      'new_key' => string '52' (length=2)


十二、驼峰命名转下划线命名(单个字符串)

/**
 * 方式一 如下:
 * 
 * 将字符串的驼峰命名转换为下划线命名(单个字符串)
 * @params string $str 要转换的字符串       
 * @return string      返回转换后的字符串
 */
function hump_to_under_line($str)
{
    $dstr = preg_replace_callback('/([A-Z]+)/',function($matchs)
    {
        return '_'.strtolower($matchs[0]);

    },$str);

    return trim(preg_replace('/_{2,}/','_',$dstr),'_');
}

//调用示例: var_dump(hump_to_under_line('userName')); //output:user_name


/**
 * 方式二 如下:
 *
 * 驼峰命名转下划线命名(单个字符串)
 *
 * 思路:小写和大写紧挨一起的地方,加上分隔符,然后全部转小写
 */
function uncamelize($camel_caps,$separator='_')
{
    return strtolower(preg_replace('/([a-z])([A-Z])/', "$1" . $separator . "$2", $camel_caps));
}

//调用示例: var_dump(uncamelize('user_name_wzyl')); //output:user_name_wzyl


十三、将数组中驼峰命名的键(key)转换为下划线命名

/**
 * 将字符串的驼峰命名转换为下划线命名(单个字符串)
 * @params string $str 要转换的字符串
 * @return string      返回转换后的字符串
 */
function hump_to_under_line($str)
{
    $dstr = preg_replace_callback('/([A-Z]+)/',function($matchs)
    {
        return '_'.strtolower($matchs[0]);

    },$str);

    return trim(preg_replace('/_{2,}/','_',$dstr),'_');
}

/**
 * 将数组中驼峰命名的键(key)转下划线命名
 * @param  array $data 转换的数组
 * @return array       返回转换后的数组
 */
function convert_hump_to_line(array $data)
{
    $result = [];

    foreach ($data as $key => $item)
    {
        if(is_array($item) || is_object($item))
        {
            $result[hump_to_under_line($key)] = convert_hump_to_line((array) $item);
        }
        else
        {
            $result[hump_to_under_line($key)] = trim($item);
        }
    }

    return $result;
}

//调用示例:
$arr = array(
    array('userName' => 'wzyl', 'fromId' => 'manager_1706','toId' => 'partner_1685','sendTime' => '2020-04-23 11:33:48'),
    array('userName' => 'lisi', 'fromId' => 'zyl_689','toId' => 'zyl_666','sendTime' => '2020-04-23 11:31:28'),
);

var_dump(convert_hump_to_line($arr));


十四、下划线命名驼峰命名

/**
 * 方式一 如下:
 * 
 * 下划线命名转换为驼峰命名
 * @params string $str 要转换的字符串       
 * @return string      返回转换后的字符串
 */
function to_camel_case($str)
{
    $array  = explode('_', $str);
    $result = $array[0];
    $len    = count($array);

    if($len > 1)
    {
        for($i = 1; $i < $len; $i++)
        {
            $result .= ucfirst($array[$i]);
        }
    }

    return $result;
}

//调用示例: var_dump(to_camel_case('user_name')); //output:userName


/**
 * 方式二 如下:
 *
 * 下划线命名转换为驼峰命名
 *
 * 思路:
 * step1、原字符串转小写,原字符串中的分隔符用空格替换,然后在字符串开头加上分隔符
 * step2、将字符串中每个单词的首字母转换为大写,再去除空格,去字符串首部附加的分隔符
 */
function camelize($uncamelized_words, $separator = '_')
{
    $uncamelized_words = $separator . str_replace($separator, " ", strtolower($uncamelized_words));

    $str = str_replace(" ", "", ucwords($uncamelized_words)); //将每个空格之间的字符串首字母大写,然后将字符串中的空格移除

    return ltrim($str, $separator); // 去除字符串最左边的$separator符号
}

//调用示例:var_dump(camelize('user_id_name')); //output:userIdName


十五、将二维数组中的key 按照数组中指定key的值进行重置 重新生成数组(生成 key => value格式)

/**
 * 将二维数组中的key 按照数组中指定key的值进行重置 重新生成数组(生成 key => value格式)
 *
 * 方式一如下(自定义函数处理):
 *
 * @param array  $array           二维数组
 * @param string $key_field_name  key的名称
 * @return array
 */
function array_to_hash_table($arr, $key_field_name)
{
    $result = array();

    if(empty($arr) || empty($key_field_name)) return $result;

    foreach ($arr as $row)
    {
        if(isset($row[$key_field_name]))
        {
            $result[$row[$key_field_name]] = $row;
        }
    }

    return $result;
}

//调用示例:
$arr = array(
    array('id' => 11, 'name' => 'php', 'price' => 99.9),
    array('id' => 66, 'name' => 'java', 'price' => 169),
    array('id' => 27, 'name' => 'golang', 'price' => 87),
);

var_dump(array_to_hash_table($arr, 'id'));

//输出结果如下:
array (size=3)
  11 => 
    array (size=3)
      'id' => int 11
      'name' => string 'php' (length=3)
      'price' => float 99.9
  66 => 
    array (size=3)
      'id' => int 66
      'name' => string 'java' (length=4)
      'price' => int 169
  27 => 
    array (size=3)
      'id' => int 27
      'name' => string 'golang' (length=6)
      'price' => int 87
      

/**
 * 将二维数组中的key 按照数组中指定key的值进行重置 重新生成数组(生成 key => value格式)
 *
 * 方式二如下(使用php内置的系统函数):
 *
 * @param array  $array      二维数组
 * @param string $column_key key的名称
 * @return array
 */
function array_to_hash_table2($arr, $column_key)
{
    if(empty($arr) || empty($column_key))
    {
        return array();
    }

    $column = array_column($arr, $column_key);

    return array_combine($column, $arr);
}

//调用示例:
var_dump(array_to_hash_table2($arr, 'id'));


十六、base64图片格式解码(将已经是base64格式数据的图片还原成为一张图片)

图片进行base64解码,相对 对图片进行base64编码来说 会麻烦一点,因为在对图片进行base64编码的时候会加入前缀字符串,编码内会加入这些字符(data:image/png;base64,) ,解码之前需要先去掉这一串字符。

函数应用场景:比如和java语言对接,java请求php接口 要上传图片,java把图片进行base64编码,PHP这边把java传过来的图片进行base64解码,然后把图片存储到服务器,然后把图片访问路径存入数据库。

/**
 * php7.4的版本下测试过该函数,一切正常 
 *
 * @param string $image 要解析图片的base64格式的数据
 * @param return        返回图片的路径(相对路径)
 */
function img_base64_decode($image)
{
    $base64_img = trim($image);
    $up_dir     = './public/static/image/'; // 图片存放的位置

    // 如果文件夹不存在则创建
    if ( !file_exists($up_dir) ) {
        mkdir($up_dir , 0777);
    }

    if ( preg_match('/^(data:\s*image\/(\w+);base64,)/' , $base64_img , $result) ) {
        $type = $result[2];

        if ( in_array($type , array('pjpeg' , 'jpeg' , 'jpg' , 'gif' , 'bmp' , 'png')) ) {
            // 图片命名 - 格式如:20200502214128.png
            $imgName  = date('YmdHis') . '.' . $type;
            $new_file = $up_dir . $imgName;

            if ( file_put_contents($new_file , base64_decode(str_replace($result[1] , '' , $base64_img))) ) {
                // 图片地址(相对路径)
                $goodsImgurl = '/static/image/' . $imgName;
                return $goodsImgurl;
            } else {
                return '';
            }
        } else {
            return '';
        }
    } else {
        return '';
    }
}


//调用示例:

//被进行base64编码的图片
$str = 'data:image/png;base64,/9j/4AAQSkZJRgABAQEASABIAAD/4QAiRXhpZgAATU0AKgAAAABAAEAD/2w(省略N多字符。。。)' //base64格式数据的图片字符串实在是太长。。这里做省略了。。只写一下图片被base64之后的一个大概base64图片格式数据。。。

$img_url = img_base64_decode($str);


十七、php基于curl 模拟post提交json格式的数据

function http_post_json($url, $data, $headers)
{
        $ch = curl_init(); //初始化curl

        curl_setopt($ch, CURLOPT_URL, $url); //设置请求的url
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  //以字符串形式返回到浏览器当中

        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); //禁止https协议验证域名,0就是禁止验证域名且兼容php5.6
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);   //禁止https协议验证ssl安全认证证书

        curl_setopt($ch, CURLOPT_POST, true); //设置POST请求方式
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data); //设置POST提交的数据

        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); //设置http 请求头

        $str = curl_exec($ch); //开始请求

        curl_close($ch); //关闭curl

        return $str; //把请求回来的数据返回
}

//调用示例
$jsonArr = ['meterCode' => '352011000041', 'beginDate' => '2022-01-27', 'endDate' => '2022-01-27'];
        
$jsonStr = json_encode($jsonArr); //设置了Content-Type: application/json,传参要转化为json,否则接口方 接收不到传过去的数据

//http 请求头设置
$headers = [
	"Content-Type: application/json",  //关键是设置这个
	"Content-Length: " . strlen($jsonStr) . "",
	"Accept: application/json"
];

$res = http_post_json('www.apidomain.com', $jsonStr, $headers);

var_dump($res);


十八、将文件转成 base64数据

/** 将文件转成 base64数据
 * @param  string $file_path 文件路径
 * @return string base64     string
 */
function file_to_base64($file_path)
{
    $base64_file = '';

    //下面这行代码 用来 获取文件的绝对路径  
    //$file_path = $_SERVER['DOCUMENT_ROOT'] . $file_path;  //由于php的安全模式 即使 文件路径能被访问到 但是file_exists函数依然有概率返回false,解决方案:可以检测文件的绝对路径即可

    if(file_exists($file_path))
    {
        $mime_type   = mime_content_type($file_path);
        $base64_data = base64_encode(file_get_contents($file_path));

        $base64_file = 'data:'.$mime_type.';base64,'.$base64_data;
    }

    return $base64_file; 
}


调用示例:
var_dump(file_to_base64('/static/xxx/xxx.pdf'));


十九、将有符号的16进制数 转换成 有符号的10进制数

/**
 * 有符号的16进制数 转换成 有符号的10进制数
 *
 * @param $hexString 有符号的16进制数
 */
function hexToShort($hexString)
{
    $binNumeric = hexdec($hexString); //将16进制数据转换成为10进制数据
    $binString  = decbin($binNumeric - 1); //将10进制数据转换成为2进制数据

    $str = '';
    for($i = 0; $i < strlen($binString); $i++)
    {
        $str .= $binString[$i] ^ 1; //循环2进制中的每一位,将2进制数据中的每一位分别和1进行 按位异或 取值,并把每一次循环结果累计拼接到$str中
    }

    return '-'.bindec($str); //将上面循环好的 累计好的新的2进制数据,转换成为10进制,前面拼接'-'负值的符号,即完成了有符号的16进制数据,转成有符号的10进制数据
}

echo hexToShort('fffa');


二十、获取指定日期的开始日(时)期(间)及结束日(时)期(间)

function get_where_data($type, $date)
{
    $day_arr = [];

    switch($type)
    {
        case 1:
            for( $i = 1; $i <= 24; $i++)
            {
                $day_arr[ $i . '时' ]['start'] = date('Y-m-d H:i:s',strtotime($date) + 3600 * ( $i ));
                $day_arr[ $i . '时' ]['end']   = date('Y-m-d H:i:s',strtotime($date) + 3600 * ( $i + 1 ));
            }
            break;
        case  2:
            for($i = 1; $i <= date('t' , strtotime($date)); $i++)
            {
                $day_arr[ $i . '日' ]['start'] = date('Y-m-d H:i:s',strtotime($date) + 86400 * ( $i - 1 ));
                $day_arr[ $i . '日' ]['end']   = date('Y-m-d H:i:s', strtotime($date) + 86400 * $i);
            }
            break;
        case 3:
            for($i = 1; $i <= 12; $i++)
            {
                $day_arr[ $i . '月' ]['start'] = date('Y-m-d H:i:s', mktime(0 , 0 , 0 , $i , 1 , intval($date)));
                $day_arr[ $i . '月' ]['end']   = date('Y-m-d H:i:s', mktime(0 , 0 , 0 , $i + 1 , 1 , intval($date)));
            }
    }

    return $day_arr;
}

//调用示例如下:

echo "<pre/>";
print_r(get_where_data(1, '2022-06-18')); //获取2022年6月18号每小时的开始时间及结束时间  输出结果如下:
Array
(
    [1时] => Array
        (
            [start] => 2022-06-18 01:00:00
            [end] => 2022-06-18 02:00:00
        )

    [2时] => Array
        (
            [start] => 2022-06-18 02:00:00
            [end] => 2022-06-18 03:00:00
        )

    [3时] => Array
        (
            [start] => 2022-06-18 03:00:00
            [end] => 2022-06-18 04:00:00
        )

    [4时] => Array
        (
            [start] => 2022-06-18 04:00:00
            [end] => 2022-06-18 05:00:00
        )

    [5时] => Array
        (
            [start] => 2022-06-18 05:00:00
            [end] => 2022-06-18 06:00:00
        )

    [6时] => Array
        (
            [start] => 2022-06-18 06:00:00
            [end] => 2022-06-18 07:00:00
        )

    [7时] => Array
        (
            [start] => 2022-06-18 07:00:00
            [end] => 2022-06-18 08:00:00
        )

    [8时] => Array
        (
            [start] => 2022-06-18 08:00:00
            [end] => 2022-06-18 09:00:00
        )

    [9时] => Array
        (
            [start] => 2022-06-18 09:00:00
            [end] => 2022-06-18 10:00:00
        )

    [10时] => Array
        (
            [start] => 2022-06-18 10:00:00
            [end] => 2022-06-18 11:00:00
        )

    [11时] => Array
        (
            [start] => 2022-06-18 11:00:00
            [end] => 2022-06-18 12:00:00
        )

    [12时] => Array
        (
            [start] => 2022-06-18 12:00:00
            [end] => 2022-06-18 13:00:00
        )

    [13时] => Array
        (
            [start] => 2022-06-18 13:00:00
            [end] => 2022-06-18 14:00:00
        )

    [14时] => Array
        (
            [start] => 2022-06-18 14:00:00
            [end] => 2022-06-18 15:00:00
        )

    [15时] => Array
        (
            [start] => 2022-06-18 15:00:00
            [end] => 2022-06-18 16:00:00
        )

    [16时] => Array
        (
            [start] => 2022-06-18 16:00:00
            [end] => 2022-06-18 17:00:00
        )

    [17时] => Array
        (
            [start] => 2022-06-18 17:00:00
            [end] => 2022-06-18 18:00:00
        )

    [18时] => Array
        (
            [start] => 2022-06-18 18:00:00
            [end] => 2022-06-18 19:00:00
        )

    [19时] => Array
        (
            [start] => 2022-06-18 19:00:00
            [end] => 2022-06-18 20:00:00
        )

    [20时] => Array
        (
            [start] => 2022-06-18 20:00:00
            [end] => 2022-06-18 21:00:00
        )

    [21时] => Array
        (
            [start] => 2022-06-18 21:00:00
            [end] => 2022-06-18 22:00:00
        )

    [22时] => Array
        (
            [start] => 2022-06-18 22:00:00
            [end] => 2022-06-18 23:00:00
        )

    [23时] => Array
        (
            [start] => 2022-06-18 23:00:00
            [end] => 2022-06-19 00:00:00
        )

    [24时] => Array
        (
            [start] => 2022-06-19 00:00:00
            [end] => 2022-06-19 01:00:00
        )

)



print_r(get_where_data(2, '2022-03')); //获取2022年3月份的每一天的开始日期到次日的结束日期  输出结果如下:
Array
(
    [1日] => Array
        (
            [start] => 2022-03-01 00:00:00
            [end] => 2022-03-02 00:00:00
        )

    [2日] => Array
        (
            [start] => 2022-03-02 00:00:00
            [end] => 2022-03-03 00:00:00
        )

    [3日] => Array
        (
            [start] => 2022-03-03 00:00:00
            [end] => 2022-03-04 00:00:00
        )

    [4日] => Array
        (
            [start] => 2022-03-04 00:00:00
            [end] => 2022-03-05 00:00:00
        )

    [5日] => Array
        (
            [start] => 2022-03-05 00:00:00
            [end] => 2022-03-06 00:00:00
        )

    [6日] => Array
        (
            [start] => 2022-03-06 00:00:00
            [end] => 2022-03-07 00:00:00
        )

    [7日] => Array
        (
            [start] => 2022-03-07 00:00:00
            [end] => 2022-03-08 00:00:00
        )

    [8日] => Array
        (
            [start] => 2022-03-08 00:00:00
            [end] => 2022-03-09 00:00:00
        )

    [9日] => Array
        (
            [start] => 2022-03-09 00:00:00
            [end] => 2022-03-10 00:00:00
        )

    [10日] => Array
        (
            [start] => 2022-03-10 00:00:00
            [end] => 2022-03-11 00:00:00
        )

    [11日] => Array
        (
            [start] => 2022-03-11 00:00:00
            [end] => 2022-03-12 00:00:00
        )

    [12日] => Array
        (
            [start] => 2022-03-12 00:00:00
            [end] => 2022-03-13 00:00:00
        )

    [13日] => Array
        (
            [start] => 2022-03-13 00:00:00
            [end] => 2022-03-14 00:00:00
        )

    [14日] => Array
        (
            [start] => 2022-03-14 00:00:00
            [end] => 2022-03-15 00:00:00
        )

    [15日] => Array
        (
            [start] => 2022-03-15 00:00:00
            [end] => 2022-03-16 00:00:00
        )

    [16日] => Array
        (
            [start] => 2022-03-16 00:00:00
            [end] => 2022-03-17 00:00:00
        )

    [17日] => Array
        (
            [start] => 2022-03-17 00:00:00
            [end] => 2022-03-18 00:00:00
        )

    [18日] => Array
        (
            [start] => 2022-03-18 00:00:00
            [end] => 2022-03-19 00:00:00
        )

    [19日] => Array
        (
            [start] => 2022-03-19 00:00:00
            [end] => 2022-03-20 00:00:00
        )

    [20日] => Array
        (
            [start] => 2022-03-20 00:00:00
            [end] => 2022-03-21 00:00:00
        )

    [21日] => Array
        (
            [start] => 2022-03-21 00:00:00
            [end] => 2022-03-22 00:00:00
        )

    [22日] => Array
        (
            [start] => 2022-03-22 00:00:00
            [end] => 2022-03-23 00:00:00
        )

    [23日] => Array
        (
            [start] => 2022-03-23 00:00:00
            [end] => 2022-03-24 00:00:00
        )

    [24日] => Array
        (
            [start] => 2022-03-24 00:00:00
            [end] => 2022-03-25 00:00:00
        )

    [25日] => Array
        (
            [start] => 2022-03-25 00:00:00
            [end] => 2022-03-26 00:00:00
        )

    [26日] => Array
        (
            [start] => 2022-03-26 00:00:00
            [end] => 2022-03-27 00:00:00
        )

    [27日] => Array
        (
            [start] => 2022-03-27 00:00:00
            [end] => 2022-03-28 00:00:00
        )

    [28日] => Array
        (
            [start] => 2022-03-28 00:00:00
            [end] => 2022-03-29 00:00:00
        )

    [29日] => Array
        (
            [start] => 2022-03-29 00:00:00
            [end] => 2022-03-30 00:00:00
        )

    [30日] => Array
        (
            [start] => 2022-03-30 00:00:00
            [end] => 2022-03-31 00:00:00
        )

    [31日] => Array
        (
            [start] => 2022-03-31 00:00:00
            [end] => 2022-04-01 00:00:00
        )

)




print_r(get_where_data(3, '2022')); //获取2022年每个月份的开始日期及结束日期  输出结果如下:
Array
(
    [1月] => Array
        (
            [start] => 2022-01-01 00:00:00
            [end] => 2022-02-01 00:00:00
        )

    [2月] => Array
        (
            [start] => 2022-02-01 00:00:00
            [end] => 2022-03-01 00:00:00
        )

    [3月] => Array
        (
            [start] => 2022-03-01 00:00:00
            [end] => 2022-04-01 00:00:00
        )

    [4月] => Array
        (
            [start] => 2022-04-01 00:00:00
            [end] => 2022-05-01 00:00:00
        )

    [5月] => Array
        (
            [start] => 2022-05-01 00:00:00
            [end] => 2022-06-01 00:00:00
        )

    [6月] => Array
        (
            [start] => 2022-06-01 00:00:00
            [end] => 2022-07-01 00:00:00
        )

    [7月] => Array
        (
            [start] => 2022-07-01 00:00:00
            [end] => 2022-08-01 00:00:00
        )

    [8月] => Array
        (
            [start] => 2022-08-01 00:00:00
            [end] => 2022-09-01 00:00:00
        )

    [9月] => Array
        (
            [start] => 2022-09-01 00:00:00
            [end] => 2022-10-01 00:00:00
        )

    [10月] => Array
        (
            [start] => 2022-10-01 00:00:00
            [end] => 2022-11-01 00:00:00
        )

    [11月] => Array
        (
            [start] => 2022-11-01 00:00:00
            [end] => 2022-12-01 00:00:00
        )

    [12月] => Array
        (
            [start] => 2022-12-01 00:00:00
            [end] => 2023-01-01 00:00:00
        )

)


二十一、二维数组 按某一个元素值进行分组,正如数据库中的group by语句效果一样

/**
 * 二维数组 按某一个元素值进行分组,正如数据库中的group by语句效果一样
 *
 * @param $array 要分组的数组数据
 * @param $key   按照$key进行分组
 * @return       返回分组后的数组
 */
function array_group_by($array, $key)
{
    $res = [];

    if(empty($array) || empty($key))
    {
        return $res;
    }

    foreach($array as $item)
    {
        $res[$item[$key]][] = $item;
    }

    return $res;
}


//调用示例如下:


/**要分组的数组数据格式示例如下:**/
$arr = array(
    array(
        "id"     => 1,
        "price" => 60,
        "name"  => "php"
    ),
    array(
        "id"     => 2,
        "price" => 60,
        "name"  => "golang"
    ),
    array(
        "id"     => 3,
        "price" => 30,
        "name"  => "java"
    ),
    array(
        "id"     => 4,
        "price" => 30,
        "name"  => "c#"
    ),
    array(
        "id"     => 5,
        "price" => 30,
        "name"  => "python"
    )
);

//调用数组分组函数
print_r(array_group_by($arr, 'price')); //将$arr数组中的数据按照price的值进行分组

/**分组后的数据结果如下:**/
Array
(
    [60] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [price] => 60
                    [name] => php
                )

            [1] => Array
                (
                    [id] => 2
                    [price] => 60
                    [name] => golang
                )

        )

    [30] => Array
        (
            [0] => Array
                (
                    [id] => 3
                    [price] => 30
                    [name] => java
                )

            [1] => Array
                (
                    [id] => 4
                    [price] => 30
                    [name] => c#
                )

            [2] => Array
                (
                    [id] => 5
                    [price] => 30
                    [name] => python
                )

        )

)


二十二、获取当前毫秒时间戳(13位时间戳)

/** 获取当前时间的毫秒时间戳(13数)
 *
 * @return float 返回13位数字的毫秒时间戳
 */
function getMillisecond()
{
    list($s1, $s2) = explode(' ', microtime());

    return (float)sprintf('%.0f', (floatval($s1) + floatval($s2)) * 1000);
}

//调用示例:
var_dump(getMillisecond());   //output:float(1662630987408)


二十三、判断输入的日期是否合法(是否是符合现实实际情况中的日期

//大概需求如下:

一年有十二个月

4,6,9,11月有30天,1,3,5,7,8,10,12月有31天

闰年2月有29天,否则28天

输入的变量年,月,日为数字




/**
 * 检测给定的一个字符串日期 是否是一个合法的且真实存在的一个有效日期
 * @param string $data 要检测的字符串日期
 */
function custom_checkdate($data)
{
    $date = strtotime($data);

    if( (date("Y-m-d", $date)) == $data || (date("Y-m-j", $date)) == $data || (date("Y-n-d", $date)) == $data || (date("Y-n-j", $date)) == $data )
    {
        echo "合法".PHP_EOL;
    }
    else
    {
        echo "非法".PHP_EOL;
    }
}

//调用示例
custom_checkdate("2008");       //输出:非法
custom_checkdate("a-b-c");      //输出:非法
custom_checkdate("2009-2-29");  //输出:非法
custom_checkdate("2009-03-31"); //输出:合法
custom_checkdate("2008-01-10"); //输出:合法
custom_checkdate("2008-2-29");  //输出:合法


二十四、获取 指定日期 距离当前时间 为多少秒前,多少分钟前,多少年前等等等等......

/**
 * 获取 指定日期 距离当前时间 为多少秒前,多少分钟前,多少年前等等等等......
 * @param string $date_time 字符串格式的日期
 */
function get_date_time_ago($date_time)
{
    $timestamp = time()-strtotime($date_time);

    $f = array(
        '31536000' => '年',
        '2592000'  => '个月',
        '604800'   => '星期',
        '86400'    => '天',
        '3600'     => '小时',
        '60'       => '分钟',
        '1'        => '秒'
    );

    foreach($f as $k => $v)
    {
        if(0 != $c = floor($timestamp / (int)$k )  )
        {
            return $c.$v.'前';
        }
    }
}

//调用示例:
echo get_date_time_ago('2022-12-12 16:15:00'); //假设现在的时间是2022-12-12 16:24:00  则这里输出:9分钟前


二十五、将毫秒级时间戳转成可视化具体日期

/**
 * @Desc:毫秒级时间戳转换成具体的日期时间
 * @param  $time 毫秒级时间戳
 * @return mixed
 */
function formatMillisecondToDateTime($time)
{
    if(empty($time))
    {
        return false;
    }

    $timestamp = intval($time / 1000); //将毫妙时间戳转换成秒级时间戳,然后对结果进行取整数
    $dateTime = date('Y-m-d H:i:s', $timestamp); //将时间戳转换成具体的时间

    return $dateTime;
}

//调用示例
print_r(formatMillisecondToDateTime("1681883406806")); //输出:2023-04-19 13:50:06
exit;


二十六、是否是微信浏览器

/**
 * @Desc:是否是微信浏览器
 * @return boolean 是:true、否:false
 */
function isWechatBrowse()
{
    return strpos($_SERVER['HTTP_USER_AGENT'] , 'MicroMessenger') !== false ? true : false;
}


二十七、是否是支付宝浏览器

/**
 * @Desc:是否是支付宝浏览器
 * @return boolean 是:true、否:false
 */
function isAlipayBrowse()
{
    return strpos($_SERVER['HTTP_USER_AGENT'] , 'AlipayClient') !== false ? true : false;
}


二十八、获取2个日期之间的所有日期数据(基于Carbon组件)

/**
 * @desc: 获取2个日期之间的所有日期数据
 * @param  string $startDate 开始日期
 * @param  string $endDate   结束日期
 * @return array
 */
function get_all_date_by_start_end($startDate, $endDate)
{
    $startDate = \Carbon\Carbon::parse($startDate);
    $endDate  = \Carbon\Carbon::parse($endDate);

    $dateArr = [];

    for($date = $startDate; $date->lte($endDate); $date->addDay())
    {
        $dateArr[] = $date->toDateString();
    }

    return $dateArr;
}

//调用示例:
$dateArr = get_all_date_by_start_end('2023-07-23', '2023-09-07');

print_r($dateArr);


//输出如下:
Array
(
    [0] => 2023-07-23
    [1] => 2023-07-24
    [2] => 2023-07-25
    [3] => 2023-07-26
    [4] => 2023-07-27
    [5] => 2023-07-28
    [6] => 2023-07-29
    [7] => 2023-07-30
    [8] => 2023-07-31
    [9] => 2023-08-01
    [10] => 2023-08-02
    [11] => 2023-08-03
    [12] => 2023-08-04
    [13] => 2023-08-05
    [14] => 2023-08-06
    [15] => 2023-08-07
    [16] => 2023-08-08
    [17] => 2023-08-09
    [18] => 2023-08-10
    [19] => 2023-08-11
    [20] => 2023-08-12
    [21] => 2023-08-13
    [22] => 2023-08-14
    [23] => 2023-08-15
    [24] => 2023-08-16
    [25] => 2023-08-17
    [26] => 2023-08-18
    [27] => 2023-08-19
    [28] => 2023-08-20
    [29] => 2023-08-21
    [30] => 2023-08-22
    [31] => 2023-08-23
    [32] => 2023-08-24
    [33] => 2023-08-25
    [34] => 2023-08-26
    [35] => 2023-08-27
    [36] => 2023-08-28
    [37] => 2023-08-29
    [38] => 2023-08-30
    [39] => 2023-08-31
    [40] => 2023-09-01
    [41] => 2023-09-02
    [42] => 2023-09-03
    [43] => 2023-09-04
    [44] => 2023-09-05
    [45] => 2023-09-06
    [46] => 2023-09-07
)


二十九、获取2个日期时间之间 相差的小时数及剩余分钟数

/**
 * 2个日期时间之间 相差的小时数及剩余分钟数
 * @param  int|string $timestamp1 第一个日期
 * @param  int|string $timestamp2 第二个日期
 * @return array
 */
function timeDiffHourRemainMinutes($timestamp1, $timestamp2)
{
    $timestamp1 = is_numeric($timestamp1) ? (int)$timestamp1 : strtotime($timestamp1);
    $timestamp2 = is_numeric($timestamp2) ? (int)$timestamp2 : strtotime($timestamp2);

    //时间差(秒)
    $differenceInSeconds = abs($timestamp2 - $timestamp1);

    $hours          = floor( $differenceInSeconds / 3600); //相差小时数
    $remainSeconds  = $differenceInSeconds - ($hours * 3600); //-去小时后的剩余秒数
    $remainMinutes  = floor($remainSeconds / 60) ; //秒转分钟

    $result = [
        'diff_hours'     => $hours,
        'remain_minutes' => $remainMinutes
    ];

    return $result;
}

var_dump(timeDiffHourRemainMinutes('2024-07-11 19:00:00', '2024-07-11 20:10:00')); //输出 diff_hours = 1, remain_minutes = 10  即:相差1小时10分钟


//以上代码基于php7.4的版本进行测试


三十、获取当前日期在当前月份中是第几周

/**
 * @desc 获取当前月份的当前天是当前月份的第几周
 * @return mixed
 */
function get_week_current_month()
{
    $date  = new DateTime(); //当前日期

    $month = $date->format('m'); //当前月份
    $day   = $date->format('d'); //当前日期是本月的第几天

    //获取本月第一天是星期几
    $firstDay       = new DateTime("first day of this month");
    $firstDayOfWeek = $firstDay->format('w'); ////获取本月第一天是星期几 星期天为 0 星期六为 6
    $week           = ceil(($day + $firstDayOfWeek - 1) / 7); //计算当前日期是本月的第几周

    return $week;
}

//假设今天是2024.11.11(这一天是星期一) 那么调用var_dump(get_week_current_month()); 输出结果是:3 即 当前天是11月份的第3周


//以上代码基于php7.0的版本中进行测试过




声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

小周博客
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复 0人评论 7,777人参与

loading