一、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的版本中进行测试过三十一、获取2个日期之间相差的时分秒数(基于Carbon组件)
/**
* 获取2个时间日期之间相差的时分秒
* @param string $bigTime 第一个时间日期(大)
* @param string $smallTime 第二个时间日期(小)
* @return array
*/
function time_diff_duration($bigTime, $smallTime)
{
//两个时间日期相差的秒数
$diffSeconds = \Carbon\Carbon::parse($bigTime)->diffInSeconds($smallTime);
$hours = (int)floor($diffSeconds / 3600); //相差的小时数 并强制转换为整数
//减去小时后 剩余的秒数
$remainingSeconds = $diffSeconds - ($hours * 3600);
//相差的分钟数 并强制转换为整数
$minutes = (int)floor($remainingSeconds / 60);
//最后获取 剩余的秒数 并强制转换为整数
$seconds = (int)$remainingSeconds - ($minutes * 60);
return [
'hours' => $hours, //小时
'minutes' => $minutes, //分钟
'seconds' => $seconds, //秒数
];
}
//调用示例:var_dump(time_diff_duration("2025-07-08 10:20:51", "2025-07-08 10:22:50"));
输出如下所示:
Array
(
[hours] => 0
[minutes] => 1
[seconds] => 59
)
2025-07-08 10:20:51 这个日期 和 2025-07-08 10:22:50 这个日期 相差0小时 1分钟59秒三十二、过滤数组中指定key的元素
/**
* 过滤数组中指定key的元素
* @param array $arr 要过滤的数组
* @param string|array $keyArr 按照keyArr进行过滤数组,keyArr指定的key元素如果在$arr存在,则$arr会删除这些元素
* @return array 返回过滤后的数组 索引保持不变
*/
function filterArrByKey($arr, $keyArr)
{
$data = [];
if(empty($arr) || empty($keyArr))
{
return $data;
}
$keyArr = (array)$keyArr;
$data = array_filter($arr, function($key)use($keyArr){
return !in_array($key, $keyArr);
}, ARRAY_FILTER_USE_KEY);
return $data;
}
//调用示例如下:
$array = [
"arms_rate" => "躯干前屈",
"eye_r_l" => "散大",
"eye_p_l" => "散大",
"eye_p_r" => "缩小",
"shiver" => "跨越障碍",
"rate" => "中",
"blood_chest" => "动脉出血",
"blood_upper" => "静脉出血",
"lung_rate" => 18,
"chest_rate" => 90
];
$keysToFilter = ['arms_rate', 'blood_chest', 'blood_upper'];
print_r(filterArrByKey($array, $keysToFilter));
Array
(
[eye_r_l] => 散大
[eye_p_l] => 散大
[eye_p_r] => 缩小
[shiver] => 跨越障碍
[rate] => 中
[lung_rate] => 18
[chest_rate] => 90
)三十三、按照key值 批量搜索数组中的指定key的元素 并返回
/**
* 按照key值 批量搜索数组中的指定key的元素 并返回
* @param array $arr 要搜索的数组
* @param string|array $keysToSearch 按照keysToSearch数组中的键 搜索arr数组 keysToSearch指定的key元素如果在$arr存在,则$arr会保留这些元素
* @return array 返回搜索后的结果数组 索引保持不变
*/
function batchSearchByKey($arr, $keysToSearch)
{
$foundElements = [];
if(empty($arr) || empty($keysToSearch))
{
return $foundElements;
}
$keysToSearch = (array)$keysToSearch;
//array_intersect_key($array1, $array2) 会返回一个数组,返回的这个数组会包含 所有在$array1中存在,并且其key也在$array2中出现的元素
$foundElements = array_intersect_key($arr, array_flip($keysToSearch));
return $foundElements;
}
//调用示例如下:
$array = [
"arms_rate" => "躯干前屈",
"eye_r_l" => "散大",
"eye_p_l" => "散大",
"eye_p_r" => "缩小",
"shiver" => "跨越障碍",
"rate" => "中",
"blood_chest" => "动脉出血",
"blood_upper" => "静脉出血",
"lung_rate" => 18,
"chest_rate" => 90
];
$keysToSearch = ['rate', 'blood_chest', 'blood_upper'];
print_r(batchSearchByKey($array, $keysToSearch));
Array
(
[rate] => 中
[blood_chest] => 动脉出血
[blood_upper] => 静脉出血
)声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。


精彩评论