functions.php 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. <?php
  2. use support\Response;
  3. use Webman\Event\Event;
  4. if (!function_exists("between_time"))
  5. {
  6. /**
  7. * 格式化起止时间(为了兼容前端RangePicker组件)
  8. * 2020-04-01T08:15:08.891Z => 1585670400
  9. * @param array $times
  10. * @param bool $isWithTime 是否包含时间
  11. * @return array
  12. */
  13. function between_time(array $times, bool $isWithTime = false): array
  14. {
  15. foreach ($times as &$time) {
  16. $time = trim($time, '&quot;');
  17. $time = str2date($time, $isWithTime);
  18. }
  19. return ['start_time' => current($times), 'end_time' => next($times)];
  20. }
  21. }
  22. if (!function_exists("str2date"))
  23. {
  24. /**
  25. * 日期转换时间戳
  26. * 例如: 2020-04-01 08:15:08 => 1585670400
  27. * @param string $date
  28. * @param bool $isWithTime 是否包含时间
  29. * @return int
  30. */
  31. function str2date(string $date, bool $isWithTime = false): int
  32. {
  33. if (!$isWithTime) {
  34. $date = date('Y-m-d', strtotime($date));
  35. }
  36. return strtotime($date);
  37. }
  38. }
  39. if (!function_exists('hide_str')) {
  40. /**
  41. * 将一个字符串部分字符用*替代隐藏
  42. * @param string $string 待转换的字符串
  43. * @param int $begin 起始位置,从0开始计数,当$type=4时,表示左侧保留长度
  44. * @param int $len 需要转换成*的字符个数,当$type=4时,表示右侧保留长度
  45. * @param int $type 转换类型:0,从左向右隐藏;1,从右向左隐藏;2,从指定字符位置分割前由右向左隐藏;3,从指定字符位置分割后由左向右隐藏;4,保留首末指定字符串中间用***代替
  46. * @param string $glue 分割符
  47. * @return string 处理后的字符串
  48. */
  49. function hide_str(string $string, int $begin = 3, int $len = 4, int $type = 0, string $glue = "@"): string
  50. {
  51. $array = array();
  52. if ($type == 0 || $type == 1 || $type == 4) {
  53. $strlen = $length = mb_strlen($string);
  54. while ($strlen) {
  55. $array[] = mb_substr($string, 0, 1, "utf8");
  56. $string = mb_substr($string, 1, $strlen, "utf8");
  57. $strlen = mb_strlen($string);
  58. }
  59. }
  60. if ($type == 0) {
  61. for ($i = $begin; $i < ($begin + $len); $i++) {
  62. if (isset($array[$i])) {
  63. $array[$i] = "*";
  64. }
  65. }
  66. $string = implode("", $array);
  67. } elseif ($type == 1) {
  68. $array = array_reverse($array);
  69. for ($i = $begin; $i < ($begin + $len); $i++) {
  70. if (isset($array[$i])) {
  71. $array[$i] = "*";
  72. }
  73. }
  74. $string = implode("", array_reverse($array));
  75. } elseif ($type == 2) {
  76. $array = explode($glue, $string);
  77. if (isset($array[0])) {
  78. $array[0] = hide_str($array[0], $begin, $len, 1);
  79. }
  80. $string = implode($glue, $array);
  81. } elseif ($type == 3) {
  82. $array = explode($glue, $string);
  83. if (isset($array[1])) {
  84. $array[1] = hide_str($array[1], $begin, $len, 0);
  85. }
  86. $string = implode($glue, $array);
  87. } elseif ($type == 4) {
  88. $left = $begin;
  89. $right = $len;
  90. $tem = array();
  91. for ($i = 0; $i < ($length - $right); $i++) {
  92. if (isset($array[$i])) {
  93. $tem[] = $i >= $left ? "" : $array[$i];
  94. }
  95. }
  96. $tem[] = '*****';
  97. $array = array_chunk(array_reverse($array), $right);
  98. $array = array_reverse($array[0]);
  99. for ($i = 0; $i < $right; $i++) {
  100. if (isset($array[$i])) {
  101. $tem[] = $array[$i];
  102. }
  103. }
  104. $string = implode("", $tem);
  105. }
  106. return $string;
  107. }
  108. }
  109. if (!function_exists('list_sort_by')) {
  110. /**
  111. *----------------------------------------------------------
  112. * 对查询结果集进行排序
  113. *----------------------------------------------------------
  114. * @access public
  115. *----------------------------------------------------------
  116. * @param array $list 查询结果
  117. * @param string $field 排序的字段名
  118. * @param string $sortBy 排序类型
  119. * @switch string asc正向排序 desc逆向排序 nat自然排序
  120. *----------------------------------------------------------
  121. * @return array
  122. *----------------------------------------------------------
  123. */
  124. function list_sort_by(array $list, string $field, string $sortBy = 'asc'): array
  125. {
  126. if (!empty($list)) {
  127. $refer = $resultSet = array();
  128. foreach ($list as $i => $data)
  129. $refer[$i] = &$data[$field];
  130. switch ($sortBy) {
  131. case 'asc': // 正向排序
  132. asort($refer);
  133. break;
  134. case 'desc':// 逆向排序
  135. arsort($refer);
  136. break;
  137. case 'nat': // 自然排序
  138. natcasesort($refer);
  139. break;
  140. }
  141. foreach ($refer as $key => $val)
  142. $resultSet[] = &$list[$key];
  143. return $resultSet;
  144. }
  145. return [];
  146. }
  147. }
  148. if (!function_exists('supplement_id')) {
  149. /**
  150. * 用户ID风格
  151. * @param string $id
  152. * @return string
  153. */
  154. function supplement_id(string $id): string
  155. {
  156. $len = strlen($id);
  157. $buf = '000000';
  158. return $len < 6 ? substr($buf, 0, (6 - $len)) . $id : $id;
  159. }
  160. }
  161. if (!function_exists('createOrderId')) {
  162. /**
  163. * 生成订单号
  164. * @param string $letter
  165. * @param int $length
  166. * @return string
  167. */
  168. function createOrderId(string $letter = '', int $length = 3): string
  169. {
  170. $gradual = 0;
  171. $orderId = date('YmdHis') . mt_rand(10000000, 99999999);
  172. $lengths = strlen($orderId);
  173. // 循环处理随机数
  174. for ($i = 0; $i < $lengths; $i++) {
  175. $gradual += (int)(substr($orderId, $i, 1));
  176. }
  177. if (empty($letter)) {
  178. $letter = get_order_letter($length);
  179. }
  180. $code = (100 - $gradual % 100) % 100;
  181. return $letter . $orderId . str_pad((string)$code, 2, '0', STR_PAD_LEFT);
  182. }
  183. }
  184. if (!function_exists('get_order_letter')) {
  185. /**
  186. * 生成订单短ID
  187. * @param int $length
  188. * @return string
  189. */
  190. function get_order_letter(int $length = 2): string
  191. {
  192. $letter_all = range('A', 'Z');
  193. shuffle($letter_all);
  194. $letter_array = array_diff($letter_all, ['I', 'O']);
  195. $letter = array_rand(array_flip($letter_array), $length);
  196. return implode('', $letter);
  197. }
  198. }
  199. if (!function_exists('object_array')) {
  200. /**
  201. * @param $array
  202. * @return array
  203. */
  204. function object_array($array): array
  205. {
  206. if(is_object($array)) {
  207. $array = (array)$array;
  208. }
  209. if(is_array($array)) {
  210. foreach($array as $key=>$value) {
  211. $array[$key] = object_array($value);
  212. }
  213. }
  214. return $array;
  215. }
  216. }
  217. if (!function_exists("getDateFull"))
  218. {
  219. /**
  220. * @param string $format
  221. * @param string $time
  222. * @return string
  223. */
  224. function getDateFull(string $format = "Y-m-d H:i:s",string $time = ""): string
  225. {
  226. if (empty($time)) $time = time();
  227. return date($format,$time);
  228. }
  229. }
  230. if (!function_exists("events"))
  231. {
  232. /**
  233. * 事件发布
  234. * @param $name
  235. * @param $data
  236. * @return array|mixed|null
  237. */
  238. function events($name,$data): mixed
  239. {
  240. return Event::dispatch($name,$data);
  241. }
  242. }
  243. if (!function_exists("success")) {
  244. /**
  245. * @param string $msg
  246. * @param array $data
  247. * @param int $code
  248. * @return Response
  249. */
  250. function success(string $msg = "", array $data = [], int $code = 1): Response
  251. {
  252. return json(compact('code', 'data', 'msg'));
  253. }
  254. }
  255. if (!function_exists("successTrans")) {
  256. /**
  257. * 消息返回
  258. * @param string $message
  259. * @param array $data
  260. * @param int $code
  261. * @return Response
  262. */
  263. function successTrans(string $message, array $data = [], int $code = 1): Response
  264. {
  265. $msg = trans($message);
  266. return json(compact("msg", "code", "data"));
  267. }
  268. }
  269. if (!function_exists("error")) {
  270. /**
  271. * @param $msg
  272. * @param array $data
  273. * @param int $code
  274. * @return Response
  275. */
  276. function error($msg, array $data = [], int $code = 0): Response
  277. {
  278. return json(compact('code', 'data', 'msg'));
  279. }
  280. }
  281. if (!function_exists("errorTrans")) {
  282. /**
  283. * 消息返回
  284. * @param string $message
  285. * @param array $data
  286. * @param int $code
  287. * @return Response
  288. */
  289. function errorTrans(string $message = "", array $data = [], int $code = 0): Response
  290. {
  291. $msg = trans($message);
  292. return json(compact("msg", "code", "data"));
  293. }
  294. }
  295. if (!function_exists("pageFormat")) {
  296. /**
  297. * @param $data
  298. * @param int $size
  299. * @return array {page:"",pageSize:"",rows:[],total:""}
  300. */
  301. function pageFormat($data, int $size = 10): array
  302. {
  303. if (empty($data)) return [];
  304. return [
  305. 'total' => $data->total(),
  306. 'page' => $data->currentPage(),
  307. 'pageSize' => $size,
  308. 'rows' => $data->items()
  309. ];
  310. }
  311. }