common.php 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. <?php
  2. // 公共助手函数
  3. if (!function_exists('__'))
  4. {
  5. /**
  6. * 获取语言变量值
  7. * @param string $name 语言变量名
  8. * @param array $vars 动态变量值
  9. * @param string $lang 语言
  10. * @return mixed
  11. */
  12. function __($name, $vars = [], $lang = '')
  13. {
  14. if (is_numeric($name) || !$name)
  15. return $name;
  16. if (!is_array($vars))
  17. {
  18. $vars = func_get_args();
  19. array_shift($vars);
  20. $lang = '';
  21. }
  22. return \think\Lang::get($name, $vars, $lang);
  23. }
  24. }
  25. if (!function_exists('format_bytes'))
  26. {
  27. /**
  28. * 将字节转换为可读文本
  29. * @param int $size 大小
  30. * @param string $delimiter 分隔符
  31. * @return string
  32. */
  33. function format_bytes($size, $delimiter = '')
  34. {
  35. $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB');
  36. for ($i = 0; $size >= 1024 && $i < 6; $i++)
  37. $size /= 1024;
  38. return round($size, 2) . $delimiter . $units[$i];
  39. }
  40. }
  41. if (!function_exists('datetime'))
  42. {
  43. /**
  44. * 将时间戳转换为日期时间
  45. * @param int $time 时间戳
  46. * @param string $format 日期时间格式
  47. * @return string
  48. */
  49. function datetime($time, $format = 'Y-m-d H:i:s')
  50. {
  51. $time = is_numeric($time) ? $time : strtotime($time);
  52. return date($format, $time);
  53. }
  54. }
  55. if (!function_exists('human_date'))
  56. {
  57. /**
  58. * 获取语义化时间
  59. * @param int $time 时间
  60. * @param int $local 本地时间
  61. * @return string
  62. */
  63. function human_date($time, $local = null)
  64. {
  65. return \fast\Date::human($time, $local);
  66. }
  67. }
  68. if (!function_exists('cdnurl'))
  69. {
  70. /**
  71. * 获取上传资源的CDN的地址
  72. * @param string $url 资源相对地址
  73. * @return string
  74. */
  75. function cdnurl($url)
  76. {
  77. return preg_match("/^https?:\/\/(.*)/i", $url) ? $url : \think\Config::get('upload.cdnurl') . $url;
  78. }
  79. }
  80. if (!function_exists('is_really_writable'))
  81. {
  82. /**
  83. * 判断文件或文件夹是否可写
  84. * @param string $file 文件或目录
  85. * @return bool
  86. */
  87. function is_really_writable($file)
  88. {
  89. if (DIRECTORY_SEPARATOR === '/')
  90. {
  91. return is_writable($file);
  92. }
  93. if (is_dir($file))
  94. {
  95. $file = rtrim($file, '/') . '/' . md5(mt_rand());
  96. if (($fp = @fopen($file, 'ab')) === FALSE)
  97. {
  98. return FALSE;
  99. }
  100. fclose($fp);
  101. @chmod($file, 0777);
  102. @unlink($file);
  103. return TRUE;
  104. }
  105. elseif (!is_file($file) OR ( $fp = @fopen($file, 'ab')) === FALSE)
  106. {
  107. return FALSE;
  108. }
  109. fclose($fp);
  110. return TRUE;
  111. }
  112. }
  113. if (!function_exists('rmdirs'))
  114. {
  115. /**
  116. * 删除文件夹
  117. * @param string $dirname 目录
  118. * @param bool $withself 是否删除自身
  119. * @return boolean
  120. */
  121. function rmdirs($dirname, $withself = true)
  122. {
  123. if (!is_dir($dirname))
  124. return false;
  125. $files = new RecursiveIteratorIterator(
  126. new RecursiveDirectoryIterator($dirname, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST
  127. );
  128. foreach ($files as $fileinfo)
  129. {
  130. $todo = ($fileinfo->isDir() ? 'rmdir' : 'unlink');
  131. $todo($fileinfo->getRealPath());
  132. }
  133. if ($withself)
  134. {
  135. @rmdir($dirname);
  136. }
  137. return true;
  138. }
  139. }
  140. if (!function_exists('copydirs'))
  141. {
  142. /**
  143. * 复制文件夹
  144. * @param string $source 源文件夹
  145. * @param string $dest 目标文件夹
  146. */
  147. function copydirs($source, $dest)
  148. {
  149. if (!is_dir($dest))
  150. {
  151. mkdir($dest, 0755);
  152. }
  153. foreach (
  154. $iterator = new RecursiveIteratorIterator(
  155. new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::SELF_FIRST) as $item
  156. )
  157. {
  158. if ($item->isDir())
  159. {
  160. $sontDir = $dest . DS . $iterator->getSubPathName();
  161. if (!is_dir($sontDir))
  162. {
  163. mkdir($sontDir);
  164. }
  165. }
  166. else
  167. {
  168. copy($item, $dest . DS . $iterator->getSubPathName());
  169. }
  170. }
  171. }
  172. }
  173. if (!function_exists('mb_ucfirst'))
  174. {
  175. function mb_ucfirst($string)
  176. {
  177. return mb_strtoupper(mb_substr($string, 0, 1)) . mb_strtolower(mb_substr($string, 1));
  178. }
  179. }
  180. if (!function_exists('addtion'))
  181. {
  182. /**
  183. * 附加关联字段数据
  184. * @param array $items 数据列表
  185. * @param mixed $fields 渲染的来源字段
  186. * @return array
  187. */
  188. function addtion($items, $fields)
  189. {
  190. if (!$items || !$fields)
  191. return $items;
  192. $fieldsArr = [];
  193. if (!is_array($fields))
  194. {
  195. $arr = explode(',', $fields);
  196. foreach ($arr as $k => $v)
  197. {
  198. $fieldsArr[$v] = ['field' => $v];
  199. }
  200. }
  201. else
  202. {
  203. foreach ($fields as $k => $v)
  204. {
  205. if (is_array($v))
  206. {
  207. $v['field'] = isset($v['field']) ? $v['field'] : $k;
  208. }
  209. else
  210. {
  211. $v = ['field' => $v];
  212. }
  213. $fieldsArr[$v['field']] = $v;
  214. }
  215. }
  216. foreach ($fieldsArr as $k => &$v)
  217. {
  218. $v = is_array($v) ? $v : ['field' => $v];
  219. $v['display'] = isset($v['display']) ? $v['display'] : str_replace(['_ids', '_id'], ['_names', '_name'], $v['field']);
  220. $v['primary'] = isset($v['primary']) ? $v['primary'] : '';
  221. $v['column'] = isset($v['column']) ? $v['column'] : 'name';
  222. $v['model'] = isset($v['model']) ? $v['model'] : '';
  223. $v['table'] = isset($v['table']) ? $v['table'] : '';
  224. $v['name'] = isset($v['name']) ? $v['name'] : str_replace(['_ids', '_id'], '', $v['field']);
  225. }
  226. unset($v);
  227. $ids = [];
  228. $fields = array_keys($fieldsArr);
  229. foreach ($items as $k => $v)
  230. {
  231. foreach ($fields as $m => $n)
  232. {
  233. if (isset($v[$n]))
  234. {
  235. $ids[$n] = array_merge(isset($ids[$n]) && is_array($ids[$n]) ? $ids[$n] : [], explode(',', $v[$n]));
  236. }
  237. }
  238. }
  239. $result = [];
  240. foreach ($fieldsArr as $k => $v)
  241. {
  242. if ($v['model'])
  243. {
  244. $model = new $v['model'];
  245. }
  246. else
  247. {
  248. $model = $v['name'] ? \think\Db::name($v['name']) : \think\Db::table($v['table']);
  249. }
  250. $primary = $v['primary'] ? $v['primary'] : $model->getPk();
  251. $result[$v['field']] = $model->where($primary, 'in', $ids[$v['field']])->column("{$primary},{$v['column']}");
  252. }
  253. foreach ($items as $k => &$v)
  254. {
  255. foreach ($fields as $m => $n)
  256. {
  257. if (isset($v[$n]))
  258. {
  259. $curr = array_flip(explode(',', $v[$n]));
  260. $v[$fieldsArr[$n]['display']] = implode(',', array_intersect_key($result[$n], $curr));
  261. }
  262. }
  263. }
  264. return $items;
  265. }
  266. }
  267. if (!function_exists('var_export_short'))
  268. {
  269. /**
  270. * 返回打印数组结构
  271. * @param string $var 数组
  272. * @param string $indent 缩进字符
  273. * @return string
  274. */
  275. function var_export_short($var, $indent = "")
  276. {
  277. switch (gettype($var))
  278. {
  279. case "string":
  280. return '"' . addcslashes($var, "\\\$\"\r\n\t\v\f") . '"';
  281. case "array":
  282. $indexed = array_keys($var) === range(0, count($var) - 1);
  283. $r = [];
  284. foreach ($var as $key => $value)
  285. {
  286. $r[] = "$indent "
  287. . ($indexed ? "" : var_export_short($key) . " => ")
  288. . var_export_short($value, "$indent ");
  289. }
  290. return "[\n" . implode(",\n", $r) . "\n" . $indent . "]";
  291. case "boolean":
  292. return $var ? "TRUE" : "FALSE";
  293. default:
  294. return var_export($var, TRUE);
  295. }
  296. }
  297. }