一、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的版本中进行测试过
声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。
精彩评论