helper.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650
  1. <?php
  2. /**
  3. * 求两个已知经纬度之间的距离,单位为米
  4. * @param lng1 $ ,lng2 经度
  5. * @param lat1 $ ,lat2 纬度
  6. * @return float 距离,单位米
  7. * @author www.Alixixi.com
  8. */
  9. if (!function_exists('getdistance')) {
  10. function getdistance($lng1, $lat1, $lng2, $lat2)
  11. {
  12. // 将角度转为狐度
  13. $radLat1 = deg2rad($lat1); //deg2rad()函数将角度转换为弧度
  14. $radLat2 = deg2rad($lat2);
  15. $radLng1 = deg2rad($lng1);
  16. $radLng2 = deg2rad($lng2);
  17. $a = $radLat1 - $radLat2;
  18. $b = $radLng1 - $radLng2;
  19. $s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2))) * 6378.137 * 1000;
  20. return $s;
  21. }
  22. }
  23. if (!function_exists('float_number')) {
  24. function float_number($number)
  25. {
  26. $number = intval($number);
  27. $length = strlen(intval($number)); //数字长度
  28. if ($length > 3) { //万单位
  29. //截取前俩为
  30. $str = substr_replace(strstr($number, substr($number, -2), ' '), '.', -1, 0) . "公里";
  31. } else {
  32. return $number . '米';
  33. }
  34. return $str . '米';
  35. }
  36. }
  37. if (!function_exists('build_field_option')) {
  38. function build_field_option($name = null, $selected = null, $type = null)
  39. {
  40. //获取选项列表
  41. $fields = \addons\qingdongams\model\Field::getField($name, $type);
  42. $html = '<option value="">请选择' . $name . '</option>';
  43. foreach ($fields as $v) {
  44. if ($selected == $v) {
  45. $html .= "<option value='{$v}' selected='selected'>{$v}</option>";
  46. } else {
  47. $html .= "<option value='{$v}'>{$v}</option>";
  48. }
  49. }
  50. return $html;
  51. }
  52. }
  53. //修改多维数组为一位数组
  54. if (!function_exists('modify_array')) {
  55. function modify_array($arr, $field1, $field2)
  56. {
  57. $data = [];
  58. foreach ($arr as $v) {
  59. $data[$v[$field1] ?? ''] = $v[$field2] ?? '';
  60. }
  61. return $data;
  62. }
  63. }
  64. //显示文件夹
  65. if (!function_exists('showdir')) {
  66. function showdir($path)
  67. {
  68. $dh = opendir($path);//打开目录
  69. $arr = [];
  70. while (($d = readdir($dh)) != false) {
  71. //逐个文件读取,添加!=false条件,是为避免有文件或目录的名称为0
  72. if ($d == '.' || $d == '..') {//判断是否为.或..,默认都会有
  73. continue;
  74. }
  75. if (is_dir($path . '/' . $d)) {//如果为目录
  76. $lowers = showdir($path . '/' . $d);//继续读取该目录下的目录或文件
  77. if ($lowers) {
  78. $arr = array_merge($arr, $lowers);
  79. }
  80. } else {
  81. $arr[] = $path . '/' . $d;
  82. }
  83. }
  84. return $arr;
  85. }
  86. }
  87. //获取年度列表
  88. if (!function_exists('getYears')) {
  89. function getYears()
  90. {
  91. $start = 2020;
  92. $years = [];
  93. $toYear = date('Y');
  94. $end = date('Y') + 1;
  95. for ($start; $start <= $end; $start++) {
  96. if ($start == $toYear) {
  97. $years[] = [
  98. 'id' => $start,
  99. 'name' => $start . '年',
  100. 'selected' => 'selected'
  101. ];
  102. } else {
  103. $years[] = [
  104. 'id' => $start,
  105. 'name' => $start . '年',
  106. ];
  107. }
  108. }
  109. return $years;
  110. }
  111. }
  112. ///随机字符串,字母+数字
  113. if (!function_exists('genRandomString')) {
  114. function genRandomString($len, $t = 0)
  115. {
  116. $chars = array(
  117. "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
  118. "l", "m", "n", "p", "q", "r", "s", "t", "u", "v",
  119. "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
  120. "H", "I", "J", "K", "L", "M", "N", "P", "Q", "R",
  121. "S", "T", "U", "V", "W", "X", "Y", "Z"
  122. );
  123. $chars1 = array(
  124. "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
  125. "l", "m", "n", "p", "q", "r", "s", "t", "u", "v",
  126. "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
  127. "H", "I", "J", "K", "L", "M", "N", "P", "Q", "R",
  128. "S", "T", "U", "V", "W", "X", "Y", "Z"
  129. );
  130. $chars2 = array(
  131. "1", "2",
  132. "3", "4", "5", "6", "7", "8", "9"
  133. );
  134. $chars3 = array(
  135. "A", "B", "C", "D", "E", "F", "G", "O",
  136. "H", "I", "J", "K", "L", "M", "N", "P", "Q", "R",
  137. "S", "T", "U", "V", "W", "X", "Y", "Z"
  138. );
  139. $chars4 = array(
  140. "A", "B", "C", "D", "E", "F", "G",
  141. "H", "I", "J", "K", "L", "M", "N", "P", "Q", "R",
  142. "S", "T", "U", "V", "W", "X", "Y", "Z", "1", "2",
  143. "3", "4", "5", "6", "7", "8", "9"
  144. );
  145. if ($t == 1) {
  146. $charsLen = count($chars1) - 1;
  147. shuffle($chars1); // 将数组打乱
  148. $output = "";
  149. for ($i = 0; $i < $len; $i++) {
  150. $output .= $chars1[mt_rand(0, $charsLen)];
  151. }
  152. } elseif ($t == 2) {
  153. $charsLen = count($chars2) - 1;
  154. shuffle($chars2); // 将数组打乱
  155. $output = "";
  156. for ($i = 0; $i < $len; $i++) {
  157. $output .= $chars2[mt_rand(0, $charsLen)];
  158. }
  159. } elseif ($t == 3) {
  160. $charsLen = count($chars3) - 1;
  161. shuffle($chars3); // 将数组打乱
  162. $output = "";
  163. for ($i = 0; $i < $len; $i++) {
  164. $output .= $chars3[mt_rand(0, $charsLen)];
  165. }
  166. } elseif ($t == 4) {
  167. $charsLen = count($chars4) - 1;
  168. shuffle($chars4); // 将数组打乱
  169. $output = "";
  170. for ($i = 0; $i < $len; $i++) {
  171. $output .= $chars4[mt_rand(0, $charsLen)];
  172. }
  173. } else {
  174. $charsLen = count($chars) - 1;
  175. shuffle($chars); // 将数组打乱
  176. $output = "";
  177. for ($i = 0; $i < $len; $i++) {
  178. $output .= $chars[mt_rand(0, $charsLen)];
  179. }
  180. }
  181. return $output;
  182. }
  183. }
  184. //将表情进行转义 用于存储的时候
  185. if (!function_exists('emoji_encode')) {
  186. function emoji_encode($str)
  187. {
  188. if (!is_string($str)) return $str;
  189. if (!$str || $str == 'undefined') return '';
  190. $text = json_encode($str); //暴露出unicode
  191. $text = preg_replace_callback("/(\\\u[2def][0-9a-f]{3})/i", function ($str) {
  192. return addslashes($str[0]);
  193. }, $text); //将emoji的unicode留下,其他不动,这里的正则比原答案增加了d,因为我发现我很多emoji实际上是\ud开头的,反而暂时没发现有\ue开头。
  194. return json_decode($text);
  195. }
  196. }
  197. //将表情进行反转义 用于读取的时候
  198. if (!function_exists('emoji_decode')) {
  199. function emoji_decode($str)
  200. {
  201. $text = json_encode($str); //暴露出unicode
  202. $text = preg_replace_callback('/\\\\\\\\/i', function ($str) {
  203. return '\\';
  204. }, $text); //将两条斜杠变成一条,其他不动
  205. return json_decode($text);
  206. }
  207. }
  208. //过滤emoji
  209. if (!function_exists('filter_Emoji')) {
  210. function filter_Emoji($str)
  211. {
  212. $str = preg_replace_callback( //执行一个正则表达式搜索并且使用一个回调进行替换
  213. '/./u',
  214. function (array $match) {
  215. return strlen($match[0]) >= 4 ? '' : $match[0];
  216. },
  217. $str);
  218. return $str;
  219. }
  220. }
  221. //获取编号
  222. if (!function_exists('get_num')) {
  223. function get_num($type)
  224. {
  225. return 'R' . date('Ymd') . rand(10000, 99999);
  226. }
  227. }
  228. if (!function_exists('setTimes')) {
  229. /**
  230. * @param $times
  231. * @param string $type date|datetime|time
  232. * @return array|string
  233. */
  234. function setTimes($times, $type = 'date')
  235. {
  236. switch ($times) {
  237. case 'today':
  238. $today = date('Y-m-d');
  239. $todayend = date('Y-m-d');
  240. $result = [$today, $todayend];
  241. break;
  242. case 'yesterday':
  243. $yesterday = date('Y-m-d', strtotime('-1 day'));
  244. $result = [$yesterday, $yesterday];
  245. break;
  246. case 'tomorrow':
  247. $tomorrow = date('Y-m-d', strtotime('+1 day'));
  248. $result = [$tomorrow, $tomorrow];
  249. break;
  250. case 'thisweek':
  251. $thisweek_start = date("Y-m-d", mktime(0, 0, 0, date("m"), date("d") - date("w") + 1, date("Y")));
  252. $thisweek_end = date("Y-m-d", mktime(23, 59, 59, date("m"), date("d") - date("w") + 7, date("Y")));
  253. $result = [$thisweek_start, $thisweek_end];
  254. break;
  255. case 'lastweek':
  256. $lastweek_start = date("Y-m-d", mktime(0, 0, 0, date("m"), date("d") - date("w") + 1 - 7, date("Y")));
  257. $lastweek_end = date("Y-m-d", mktime(23, 59, 59, date("m"), date("d") - date("w") + 7 - 7, date("Y")));
  258. $result = [$lastweek_start, $lastweek_end];
  259. break;
  260. case 'nextweek':
  261. $lastweek_start = date("Y-m-d", mktime(0, 0, 0, date("m"), date("d") - date("w") + 1 + 7, date("Y")));
  262. $lastweek_end = date("Y-m-d", mktime(23, 59, 59, date("m"), date("d") - date("w") + 7 + 7, date("Y")));
  263. $result = [$lastweek_start, $lastweek_end];
  264. break;
  265. case 'thismonth':
  266. $thismonth_start = date("Y-m-d", mktime(0, 0, 0, date("m"), 1, date("Y")));
  267. $thismonth_end = date("Y-m-d", mktime(23, 59, 59, date("m"), date("t"), date("Y")));
  268. $result = [$thismonth_start, $thismonth_end];
  269. break;
  270. case 'lastmonth':
  271. $lastmonth_start = date("Y-m-d", mktime(0, 0, 0, date("m") - 1, 1, date("Y")));
  272. $lastmonth_end = date("Y-m-d", mktime(23, 59, 59, date("m"), 0, date("Y")));
  273. $result = [$lastmonth_start, $lastmonth_end];
  274. break;
  275. case 'nextmonth':
  276. $nextmonth_start = date("Y-m-d", mktime(0, 0, 0, date("m") + 1, 1, date("Y")));
  277. $nextmonth_end = date("Y-m-d", mktime(23, 59, 59, date("m") + 1, date("t"), date("Y")));
  278. $result = [$nextmonth_start, $nextmonth_end];
  279. break;
  280. case 'thisquarter':
  281. //本季度未最后一月天数
  282. $getMonthDays = date("t", mktime(0, 0, 0, date('n') + (date('n') - 1) % 3, 1, date("Y")));
  283. //本季度/
  284. $thisquarter_start = date('Y-m-d', mktime(0, 0, 0, date('n') - (date('n') - 1) % 3, 1, date('Y')));
  285. $thisquarter_end = date('Y-m-d', mktime(23, 59, 59, date('n') + (date('n') - 1) % 3, $getMonthDays, date('Y')));
  286. $result = [$thisquarter_start, $thisquarter_end];
  287. break;
  288. case 'lastquarter':
  289. //上季度未最后一月天数
  290. $getMonthDays = date("t", mktime(0, 0, 0, date('n') + (date('n') - 1) % 3 - 3, 1, date("Y")));
  291. $thisquarter_start = date('Y-m-d', mktime(0, 0, 0, date('n') - (date('n') - 1) % 3 - 3, 1, date('Y')));
  292. $thisquarter_end = date('Y-m-d', mktime(23, 59, 59, date('n') + (date('n') - 1) % 3 - 3, $getMonthDays, date('Y')));
  293. $result = [$thisquarter_start, $thisquarter_end];
  294. break;
  295. case 'nextquarter':
  296. //下季度未最后一月天数
  297. $getMonthDays = date("t", mktime(0, 0, 0, date('n') + (date('n') - 1) % 3 + 3, 1, date("Y")));
  298. $thisquarter_start = date('Y-m-d', mktime(0, 0, 0, date('n') - (date('n') - 1) % 3 + 3, 1, date('Y')));
  299. $thisquarter_end = date('Y-m-d', mktime(23, 59, 59, date('n') + (date('n') - 1) % 3 + 3, $getMonthDays, date('Y')));
  300. $result = [$thisquarter_start, $thisquarter_end];
  301. break;
  302. case 'thisyear':
  303. //今年
  304. $thisyear_start = date('Y') . '-1-1';
  305. $thisquarter_end = date('Y') . '-12-31';
  306. $result = [$thisyear_start, $thisquarter_end];
  307. break;
  308. case 'lastyear':
  309. //去年
  310. $lastyear_start = date('Y')-1 . '-1-1';
  311. $lastyear_end = date('Y')-1 . '-12-31';
  312. $result = [$lastyear_start, $lastyear_end];
  313. break;
  314. case 'nextyear':
  315. //下一年
  316. $nextyear_start = date('Y')+1 . '-1-1';
  317. $nextyear_end = date('Y')+1 . '-12-31';
  318. $result = [$nextyear_start, $nextyear_end];
  319. break;
  320. case 'else'://其他
  321. $dates=input('dates','','trim');
  322. $times = explode(' - ', $dates);
  323. $result = [$times[0] ?? date('Y-m-d'), $times[1] ?? date('Y-m-d')];
  324. break;
  325. default:
  326. $times = explode(',', $times);
  327. $result = [$times[0] ?? date('Y-m-d'), $times[1] ?? date('Y-m-d')];
  328. break;
  329. }
  330. if ($type == 'date') {
  331. return $result;
  332. } elseif ($type == 'datetime') {
  333. $result[0] = date('Y-m-d H:i:s', strtotime($result[0]));
  334. $result[1] = date('Y-m-d H:i:s', strtotime($result[1]) + 86400 - 1);
  335. return $result;
  336. } elseif ($type == 'time') {
  337. $result[0] =strtotime($result[0]);
  338. $result[1] =strtotime($result[1]) + 86400 - 1;
  339. return $result;
  340. } else {
  341. return $result;
  342. }
  343. }
  344. }
  345. if (!function_exists('export_excel')){
  346. //导出excel
  347. function export_excel($title, $expTableData, $excel = 'export')
  348. {
  349. header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  350. header('Content-Disposition: attachment;filename=' . $excel . '.xlsx');
  351. header('Cache-Control: max-age=0');
  352. $obj = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
  353. // 以下内容是excel文件的信息描述信息
  354. $obj->getProperties()->setTitle('导出文件'); //设置标题
  355. $obj->setActiveSheetIndex(0);
  356. $obj->getActiveSheet()->setTitle('导出文件');
  357. /* 循环读取每个单元格的数据 */
  358. $a = 'A';
  359. $currentSheet = $obj->getActiveSheet();
  360. foreach ($title as $key => $value) {
  361. //读取工作表1
  362. // 设置第一行加粗
  363. $obj->getActiveSheet()->getStyle($a . '1')->getFont()->setBold(true);
  364. //这里是设置单元格的内容
  365. $currentSheet->getCell($a . '1')->setValue($value);
  366. $a++;
  367. }
  368. //行数循环
  369. $b = 2;
  370. foreach ($expTableData as $k => $row) {
  371. $a = 'A';
  372. foreach ($row as $key => $value) {
  373. //这里是设置单元格的内容
  374. $currentSheet->getCell($a . $b)->setValue($value);
  375. $a++;
  376. }
  377. $b++;
  378. }
  379. $PHPWriter = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($obj);
  380. $fileName = $excel . date('YmdHis') . '.xlsx';
  381. $file_path = ROOT_PATH . 'public' . '/export/' . date('Y-m-d') . '/' . $fileName;
  382. // 创建文件夹
  383. $path_info = pathinfo($file_path);
  384. if ($path_info['dirname'] && !is_dir($path_info['dirname'])) {
  385. $result = create_dir($path_info['dirname']);
  386. if (false === $result) {
  387. return false;
  388. }
  389. }
  390. $PHPWriter->save($file_path);
  391. $datas['filePath'] = '/' . 'export/' . date('Y-m-d') . '/' . $fileName;
  392. $datas['fileName'] = $fileName;
  393. $datas['size'] = filesize('./' . 'export/' . date('Y-m-d') . '/' . $fileName);
  394. return $datas;
  395. }
  396. }
  397. if (!function_exists('create_dir')){
  398. /**
  399. * 创建文件夹,可以多级创建
  400. * @param string $filename 需要创建的文件夹路径
  401. * @return boolean
  402. */
  403. function create_dir($filename) {
  404. if (!is_dir($filename)) {
  405. create_dir(dirname($filename));
  406. return mkdir($filename, 0777);
  407. }
  408. return true;
  409. }
  410. }
  411. if (!function_exists('convertAmountToCn')){
  412. /**
  413. * 将数值金额转换为中文大写金额
  414. * @param $amount float 金额(支持到分)
  415. * @param $type int 补整类型,0:到角补整;1:到元补整
  416. * @return mixed 中文大写金额
  417. */
  418. function convertAmountToCn($amount, $type = 1)
  419. {
  420. // 判断输出的金额是否为数字或数字字符串
  421. if (!is_numeric($amount)) {
  422. return "要转换的金额只能为数字!";
  423. }
  424. // 金额为0,则直接输出"零元整"
  425. if ($amount == 0) {
  426. return "人民币零元整";
  427. }
  428. // 金额不能为负数
  429. if ($amount < 0) {
  430. return "要转换的金额不能为负数!";
  431. }
  432. // 金额不能超过万亿,即12位
  433. if (strlen($amount) > 12) {
  434. return "要转换的金额不能为万亿及更高金额!";
  435. }
  436. // 预定义中文转换的数组
  437. $digital = array('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖');
  438. // 预定义单位转换的数组
  439. $position = array('仟', '佰', '拾', '亿', '仟', '佰', '拾', '万', '仟', '佰', '拾', '元');
  440. // 将金额的数值字符串拆分成数组
  441. $amountArr = explode('.', $amount);
  442. // 将整数位的数值字符串拆分成数组
  443. $integerArr = str_split($amountArr[0], 1);
  444. // 将整数部分替换成大写汉字
  445. $result = '';
  446. $integerArrLength = count($integerArr); // 整数位数组的长度
  447. $positionLength = count($position); // 单位数组的长度
  448. for ($i = 0; $i < $integerArrLength; $i++) {
  449. // 如果数值不为0,则正常转换
  450. if ($integerArr[$i] != 0) {
  451. $result = $result . $digital[$integerArr[$i]] . $position[$positionLength - $integerArrLength + $i];
  452. } else {
  453. // 如果数值为0, 且单位是亿,万,元这三个的时候,则直接显示单位
  454. if (($positionLength - $integerArrLength + $i + 1) % 4 == 0) {
  455. $result = $result . $position[$positionLength - $integerArrLength + $i];
  456. }
  457. }
  458. }
  459. // 如果小数位也要转换
  460. if ($type == 0) {
  461. // 将小数位的数值字符串拆分成数组
  462. $decimalArr = str_split($amountArr[1], 1);
  463. // 将角替换成大写汉字. 如果为0,则不替换
  464. if ($decimalArr[0] != 0) {
  465. $result = $result . $digital[$decimalArr[0]] . '角';
  466. }
  467. // 将分替换成大写汉字. 如果为0,则不替换
  468. if ($decimalArr[1] != 0) {
  469. $result = $result . $digital[$decimalArr[1]] . '分';
  470. }
  471. } else {
  472. $result = $result . '整';
  473. }
  474. return $result;
  475. }
  476. }
  477. if (!function_exists('getItemNumber')) {
  478. function getItemNumber($type)
  479. {
  480. if ($type == 'quote') {
  481. return 'Q' . date('ymd') . rand(1, 9999);
  482. }
  483. if ($type == 'consume') {
  484. return 'F' . date('ymd') . rand(1, 9999);
  485. }
  486. if ($type == 'contract') {
  487. return 'K' . date('ymd') . rand(1, 9999);
  488. }
  489. if ($type == 'workorder') {
  490. return 'W' . date('ymd') . rand(1, 9999);
  491. }
  492. if ($type == 'export') {
  493. return 'Ck' . date('ymd') . rand(1, 9999);
  494. }
  495. if ($type == 'import') {
  496. return 'Rk' . date('ymd') . rand(1, 9999);
  497. }
  498. if ($type == 'receivables') {
  499. return 'R' . date('ymd') . rand(1, 9999);
  500. }
  501. return date('ymd') . rand(1, 9999);
  502. }
  503. }
  504. //获取date时间列表
  505. if (!function_exists('getDateList')) {
  506. function getDateList($start_time, $end_time)
  507. {
  508. $data = [];
  509. for ($i = $start_time; $i < $end_time; $i = $i + 86400) {
  510. $data[] = date('Y-m-d', $i);
  511. }
  512. return $data;
  513. }
  514. }
  515. if (!function_exists('getRatio')) {
  516. //获取比例
  517. function getRatio($number, $achievement)
  518. {
  519. if (empty($number)) {
  520. return 0;
  521. }
  522. if ($achievement == 0) {
  523. return 0;
  524. }
  525. return $achievement ? intval(sprintf("%.2f", $number / $achievement) * 100) : 0;
  526. }
  527. }
  528. //根据时间段获取所包含的年份
  529. function getYearByTime($start_time, $end_time)
  530. {
  531. $yearArr = [];
  532. $monthArr = monthList($start_time, $end_time);
  533. foreach ($monthArr as $v) {
  534. $yearArr[date('Y',$v)] = date('Y',$v);
  535. }
  536. return array_values($yearArr);
  537. }
  538. /**
  539. * 生成从开始月份到结束月份的月份数组
  540. * @param int $start 开始时间戳
  541. * @param int $end 结束时间戳
  542. */
  543. function monthList($start,$end){
  544. if (!is_numeric($start) || !is_numeric($end) || ($end <= $start)) return '';
  545. $start = date('Y-m',$start);
  546. $end = date('Y-m',$end);
  547. //转为时间戳
  548. $start = strtotime($start.'-01');
  549. $end = strtotime($end.'-01');
  550. $i = 0;
  551. $d = array();
  552. while ($start <= $end) {
  553. //这里累加每个月的的总秒数 计算公式:上一月1号的时间戳秒数减去当前月的时间戳秒数
  554. $d[$i] = $start;
  555. $start += strtotime('+1 month',$start)-$start;
  556. $i++;
  557. }
  558. return $d;
  559. }
  560. //根据时间段获取所包含的月份
  561. function getmonthByTime($start_time, $end_time)
  562. {
  563. $monthList = [];
  564. $monthArr = monthList($start_time, $end_time);
  565. foreach ($monthArr as $v) {
  566. $monthList[date('Y',$v)][] = date('m',$v);
  567. }
  568. return $monthList;
  569. }