企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
自定义PHP常用功能函数 https://www.php.cn/php-weizijiaocheng-395312.html // +---------------------------------------------------------------------- // | PHP公共函数库 // +---------------------------------------------------------------------- // | Date : 2018-05-04 // +---------------------------------------------------------------------- // | create by: sublime text 3 // +---------------------------------------------------------------------- // | Author: deng // +----------------------------------------------------------------------     /\*\*     \* 预定义常量     \*/     define("CHARSET", "utf-8");     /\*\*     \* 冒泡排序     \* @param  Array 排序数组     \* @return Array 排序号的数组     \*/     function bubbleSort($arr)     {        $len=count($arr);       //该层循环控制 需要冒泡的轮数       for($i=1;$i<$len;$i++)       { //该层循环用来控制每轮 冒出一个数 需要比较的次数         for($k=0;$k<$len-$i;$k++)         {            if($arr\[$k\]>$arr\[$k+1\])             {                 $tmp=$arr\[$k+1\];                 $arr\[$k+1\]=$arr\[$k\];                 $arr\[$k\]=$tmp;             }         }       }       return $arr;     }       /\*\*     \* 选择排序     \* @param   Array     \* @return  Array     \*/     function selectSort($arr) {     //双重循环完成,外层控制轮数,内层控制比较次数      $len=count($arr);         for($i=0; $i<$len-1; $i++) {             //先假设最小的值的位置             $p = $i;                           for($j=$i+1; $j<$len; $j++) {                 //$arr\[$p\] 是当前已知的最小值                 if($arr\[$p\] > $arr\[$j\]) {                 //比较,发现更小的,记录下最小值的位置;并且在下次比较时采用已知的最小值进行比较。                     $p = $j;                 }             }             //已经确定了当前的最小值的位置,保存到$p中。如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可。             if($p != $i) {                 $tmp = $arr\[$p\];                 $arr\[$p\] = $arr\[$i\];                 $arr\[$i\] = $tmp;             }         }         //返回最终结果         return $arr;     }       /\*\*     \* 插入排序     \* @param Array     \* @return Array     \*/     function insertSort($arr) {         $len=count($arr);         for($i=1; $i<$len; $i++) {             $tmp = $arr\[$i\];             //内层循环控制,比较并插入             for($j=$i-1;$j>=0;$j--) {                 if($tmp < $arr\[$j\]) {                     //发现插入的元素要小,交换位置,将后边的元素与前面的元素互换                     $arr\[$j+1\] = $arr\[$j\];                     $arr\[$j\] = $tmp;                 }                 else {                     //如果碰到不需要移动的元素,由于是已经排序好是数组,则前面的就不需要再次比较了。                     break;                 }             }         }         return $arr;     }     /\*\*     \* 快速排序     \* @param Array     \* @return Array     \*/     function quickSort($arr) {         //先判断是否需要继续进行         $length = count($arr);         if($length <= 1) {             return $arr;         }         //选择第一个元素作为基准         $base\_num = $arr\[0\];         //遍历除了标尺外的所有元素,按照大小关系放入两个数组内         //初始化两个数组         $left\_array = array();  //小于基准的         $right\_array = array();  //大于基准的         for($i=1; $i<$length; $i++) {             if($base\_num > $arr\[$i\]) {                 //放入左边数组                 $left\_array\[\] = $arr\[$i\];             }             else{                 //放入右边                 $right\_array\[\] = $arr\[$i\];             }         }         //再分别对左边和右边的数组进行相同的排序处理方式递归调用这个函数         $left\_array = quick\_sort($left\_array);         $right\_array = quick\_sort($right\_array);         //合并         return array\_merge($left\_array, array($base\_num), $right\_array);     }       /\*\*     \* 随机生成几位数字     \* @param  $num Int     \* @return Int     \*/     function randomInt($num){         if(is\_null($num) || empty($num) || !isset($num)){             $num = 6;         }         else{             $param = str\_pad(mt\_rand(0, 999999), $num, "0", STR\_PAD\_BOTH);// 返回 input 被从左端、右端或者同时两端被填充到制定长度后的结果。如果可选的 pad\_string 参数没有被指定,input 将被空格字符填充,否则它将被 pad\_string 填充到指定长度         }         return $param;     }       /\*\*      \* 生成随机字符串,可以自己扩展   //若想唯一,只需在开头加上用户id      \* $type可以为:upper(只生成大写字母),lower(只生成小写字母),number(只生成数字)      \* $len为长度,定义字符串长度      \* @param $len   int 指定字符串长度      \* @param $type  类型      \* @param return 随机字符串      \*/     function randomString($type, $len = 0) {         $new = '';         $string = '123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ';  //数据池         if ($type == 'upper') {             for ($i = 0; $i < $len; $i++) {                 $new .= $string\[mt\_rand(36, 61)\];             }             return $new;         }         if ($type == 'lower') {             for ($i = 0; $i < $len; $i++) {                 $new .= $string\[mt\_rand(10, 35)\];             }             return $new;         }         if ($type == 'number') {             for ($i = 0; $i < $len; $i++) {                 $new .= $string\[mt\_rand(0, 9)\];             }             return $new;         }     }     /\*\*     \* 正则验证邮箱地址     \* @param $email String     \* @return Bool     \*/     function matchEmail($email){         if(!preg\_match('/^(\\w-\*\\.\*)+@(\\w-?)+(\\.\\w{2,})+$/', $email)){             return false;         }         else{             return true;         }     }       /\*\*     \* 正则匹配电话号码     \* @param Int $phone     \* @return Bool     \*/     function matchPhone($phone)     {         if(!preg\_match('/^(13\[0-9\]|14\[5|7\]|15\[0-9\]|16\[0-9\]|17\[0-9\]|18\[0-9\]|19\[0-9\])\\d{8}$/', $phone)){             return false;         }         else{             return true;         }     }       /\*\*     \* 图片转base64     \* @param ImageFile String 图片路径     \* @return 转为base64的图片     \*/     function Base64EncodeImage($ImageFile) {       if(file\_exists($ImageFile) || is\_file($ImageFile)){           $base64\_image = '';           $image\_info = getimagesize($image\_file);           $image\_data = fread(fopen($image\_file, 'r'), filesize($image\_file));           $base64\_image = 'data:' . $image\_info\['mime'\] . ';base64,' . chunk\_split(base64\_encode($image\_data));           return $base64\_image;       }       else{         return false;       }   }       /\*\*      \* 返回经addslashes处理过的字符串或数组      \* @param $string 需要处理的字符串或数组      \* @return mixed      \*/     function newAddslashes($string){         if(!is\_array($string)) return addslashes($string);         foreach($string as $key => $val) $string\[$key\] = new\_addslashes($val);         return $string;     }       /\*\*      \* 返回经stripslashes处理过的字符串或数组      \* @param $string 需要处理的字符串或数组      \* @return mixed      \*/     function newStripslashes($string) {         if(!is\_array($string)) return stripslashes($string);         foreach($string as $key => $val) $string\[$key\] = new\_stripslashes($val);         return $string;     }       /\*\*      \* 返回经htmlspecialchars处理过的字符串或数组      \* @param $string 需要处理的字符串或数组      \* @return mixed      \*/     function newHtmlSpecialChars($string) {         $encoding = 'utf-8';         if(strtolower(CHARSET)=='gbk') $encoding = 'ISO-8859-15';         if(!is\_array($string)) return htmlspecialchars($string,ENT\_QUOTES,$encoding);         foreach($string as $key => $val) $string\[$key\] = new\_html\_special\_chars($val);         return $string;     }       /\*\*      \* 返回经html\_entity\_decode处理过的字符串或数组      \* @param $string 需要处理的字符串或数组      \* @return mixed      \*/     function newHtmlEentityDdecode($string) {         $encoding = 'utf-8';         if(strtolower(CHARSET)=='gbk') $encoding = 'ISO-8859-15';         return html\_entity\_decode($string,ENT\_QUOTES,$encoding);     }       /\*\*      \* 返回经htmlentities处理过的字符串或数组      \* @param $string 需要处理的字符串或数组      \* @return mixed      \*/     function newHtmlentities($string) {         $encoding = 'utf-8';         if(strtolower(CHARSET)=='gbk') $encoding = 'ISO-8859-15';         return htmlentities($string,ENT\_QUOTES,$encoding);     }       /\*\*      \* 安全过滤函数      \*      \* @param $string      \* @return string      \*/     function safeReplace($string) {         $string = str\_replace('%20','',$string);         $string = str\_replace('%27','',$string);         $string = str\_replace('%2527','',$string);         $string = str\_replace('\*','',$string);         $string = str\_replace('"','"',$string);         $string = str\_replace("'",'',$string);         $string = str\_replace('"','',$string);         $string = str\_replace(';','',$string);         $string = str\_replace('<','<',$string);         $string = str\_replace('>','>',$string);         $string = str\_replace("{",'',$string);         $string = str\_replace('}','',$string);         $string = str\_replace('\\\\','',$string);         return $string;     }       /\*\*      \* 过滤ASCII码从0-28的控制字符      \* @return String      \*/     function trimUnsafeControlChars($str) {         $rule = '/\[' . chr ( 1 ) . '-' . chr ( 8 ) . chr ( 11 ) . '-' . chr ( 12 ) . chr ( 14 ) . '-' . chr ( 31 ) . '\]\*/';         return str\_replace ( chr ( 0 ), '', preg\_replace ( $rule, '', $str ) );     }       /\*\*      \* 格式化文本域内容      \*      \* @param $string 文本域内容      \* @return string      \*/     function trimTextarea($string) {         $string = nl2br ( str\_replace ( ' ', ' ', $string ) );         return $string;     } \---------------------   /\*\*      \* 将文本格式成适合js输出的字符串      \* @param string $string 需要处理的字符串      \* @param intval $isjs 是否执行字符串格式化,默认为执行      \* @return string 处理后的字符串      \*/     function formatJs($string, $isjs = 1) {         $string = addslashes(str\_replace(array("\\r", "\\n", "\\t"), array('', '', ''), $string));         return $isjs ? 'document.write("'.$string.'");' : $string;     }     /\*\*      \* 转义 javascript 代码标记      \*      \* @param $str      \* @return mixed      \*/      function trimScript($str) {         if(is\_array($str)){             foreach ($str as $key => $val){                 $str\[$key\] = trim\_script($val);             }          }          else{              $str = preg\_replace ( '/\\\]\*?)\\>/si', '', $str );             $str = preg\_replace ( '/\\\]\*?)\\>/si', '', $str );             $str = preg\_replace ( '/\\\]\*?)\\>/si', '', $str );             $str = str\_replace ( 'javascript:', 'javascript:', $str );          }         return $str;     }     /\*\*      \* 获取当前页面完整URL地址      \* @return url      \*/     function getUrl() {         $sys\_protocal = isset($\_SERVER\['SERVER\_PORT'\]) && $\_SERVER\['SERVER\_PORT'\] == '443' ? 'https://' : 'http://';         $php\_self = $\_SERVER\['PHP\_SELF'\] ? safe\_replace($\_SERVER\['PHP\_SELF'\]) : safe\_replace($\_SERVER\['SCRIPT\_NAME'\]);         $path\_info = isset($\_SERVER\['PATH\_INFO'\]) ? safe\_replace($\_SERVER\['PATH\_INFO'\]) : '';         $relate\_url = isset($\_SERVER\['REQUEST\_URI'\]) ? safe\_replace($\_SERVER\['REQUEST\_URI'\]) : $php\_self.(isset($\_SERVER\['QUERY\_STRING'\]) ? '?'.safe\_replace($\_SERVER\['QUERY\_STRING'\]) : $path\_info);         return $sys\_protocal.(isset($\_SERVER\['HTTP\_HOST'\]) ? $\_SERVER\['HTTP\_HOST'\] : '').$relate\_url;     }     /\*\*      \* 字符截取 支持UTF8/GBK      \* @param $string 截取的字符串      \* @param $length 截取长度      \* @param $dot      \*/     function strCut($string, $length, $dot = '...') {         $strlen = strlen($string);         if($strlen <= $length) return $string;         $string = str\_replace(array(' ',' ', '&', '"', ''', '“', '”', '—', '', '·', '…'), array('∵',' ', '&', '"', "'", '“', '”', '—', '', '·', '…'), $string);         $strcut = '';         if(strtolower(CHARSET) == 'utf-8') {             $length = intval($length-strlen($dot)-$length/3);             $n = $tn = $noc = 0;             while($n < strlen($string)) {                 $t = ord($string\[$n\]);                 if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {                     $tn = 1; $n++; $noc++;                 } elseif(194 <= $t && $t <= 223) {                     $tn = 2; $n += 2; $noc += 2;                 } elseif(224 <= $t && $t <= 239) {                     $tn = 3; $n += 3; $noc += 2;                 } elseif(240 <= $t && $t <= 247) {                     $tn = 4; $n += 4; $noc += 2;                 } elseif(248 <= $t && $t <= 251) {                     $tn = 5; $n += 5; $noc += 2;                 } elseif($t == 252 || $t == 253) {                     $tn = 6; $n += 6; $noc += 2;                 } else {                     $n++;                 }                 if($noc >= $length) {                     break;                 }             }             if($noc > $length) {                 $n -= $tn;             }             $strcut = substr($string, 0, $n);             $strcut = str\_replace(array('∵', '&', '"', "'", '“', '”', '—', '', '·', '…'), array(' ', '&', '"', ''', '“', '”', '—', '', '·', '…'), $strcut);         }         else{             $dotlen = strlen($dot);             $maxi = $length - $dotlen - 1;             $current\_str = '';             $search\_arr = array('&',' ', '"', "'", '“', '”', '—', '', '·', '…','∵');             $replace\_arr = array('&',' ', '"', ''', '“', '”', '—', '', '·', '…',' ');             $search\_flip = array\_flip($search\_arr);             for ($i = 0; $i < $maxi; $i++) {                 $current\_str = ord($string\[$i\]) > 127 ? $string\[$i\].$string\[++$i\] : $string\[$i\];                 if (in\_array($current\_str, $search\_arr)) {                     $key = $search\_flip\[$current\_str\];                     $current\_str = str\_replace($search\_arr\[$key\], $replace\_arr\[$key\], $current\_str);                 }                 $strcut .= $current\_str;             }         }         return $strcut.$dot;     }     /\*\*      \* 获取请求ip      \* @return ip地址      \*/     function getIp() {         if(getenv('HTTP\_CLIENT\_IP') && strcasecmp(getenv('HTTP\_CLIENT\_IP'), 'unknown')) {             $ip = getenv('HTTP\_CLIENT\_IP');         } elseif(getenv('HTTP\_X\_FORWARDED\_FOR') && strcasecmp(getenv('HTTP\_X\_FORWARDED\_FOR'), 'unknown')) {             $ip = getenv('HTTP\_X\_FORWARDED\_FOR');         } elseif(getenv('REMOTE\_ADDR') && strcasecmp(getenv('REMOTE\_ADDR'), 'unknown')) {             $ip = getenv('REMOTE\_ADDR');         } elseif(isset($\_SERVER\['REMOTE\_ADDR'\]) && $\_SERVER\['REMOTE\_ADDR'\] && strcasecmp($\_SERVER\['REMOTE\_ADDR'\], 'unknown')) {             $ip = $\_SERVER\['REMOTE\_ADDR'\];         }         return preg\_match ( '/\[\\d\\.\]{7,15}/', $ip, $matches ) ? $matches \[0\] : '';     }     /\*\*     \* 字节换算     \* @param    string    $filesize    字节大小     \* @return    string    返回大小     \*/     function sizeCount($filesize) {         if ($filesize >= 1073741824) {             $filesize = round($filesize / 1073741824 \* 100) / 100 .' GB';         } elseif ($filesize >= 1048576) {             $filesize = round($filesize / 1048576 \* 100) / 100 .' MB';         } elseif($filesize >= 1024) {             $filesize = round($filesize / 1024 \* 100) / 100 . ' KB';         } else {             $filesize = $filesize.' Bytes';         }         return $filesize;     }     /\*\*     \* 获取下个月第一天和最后一天     \* @param 上月时间     \* @return 返回下月最后一天     \*/     function getNextMonthDays($date){         $timestamp=strtotime($date);         $arr=getdate($timestamp);         if($arr\['mon'\] == 12){             $year=$arr\['year'\] +1;             $month=$arr\['mon'\] -11;             $firstday=$year.'-0'.$month.'-01';             $lastday=date('Y-m-d',strtotime("$firstday +1 month -1 day"));         }else{             $firstday=date('Y-m-01',strtotime(date('Y',$timestamp).'-'.(date('m',$timestamp)+1).'-01'));             $lastday=date('Y-m-d',strtotime("$firstday +1 month -1 day"));         }          return array($firstday,$lastday);     }     /\*\*     \* 获取给定月份的天数     \* @param Int $month  需要获取天数的月份     \* @param Int $year   需要获取天数的年份     \* @return Int 天数     \*/     function getDays($month,$year){         switch($month){             case '1':             case '3':             case '5':             case '7':             case '8':             case '10':             case '12':                 return 31;             break;             case '4':             case '6':             case '9':             case '11':                 return 30;             break;             case '2':                 if(($year%4==0 && $year%100!=0) || $year%400==0){//整百的年份要同时满足400的倍数才算闰年                     return 29;                 }else{                     return 28;                 }             break;         }     }     /\*\*     \* 获取指定日期的前/后多少天,月,年     \* @param Date $vdate 指定的日期     \* @param Int  $num  向前还是向后     \* @param string $vtype 天/月/年     \* @return Date 获取的时间     \*/     function dateCount($vdate,$vnum,$vtype){         $day = date('j',strtotime($vdate));         $month = date('n',strtotime($vdate));         $year = date('Y',strtotime($vdate));         switch($vtype){             case 'day':                 if($vnum >= 0){                     $day = $day + abs($vnum);                 }else{                     $day = $day - abs($vnum);                 }             break;             case 'month':                 if($vnum >= 0){                     $month = $month+ abs($vnum);                 }else{                     $month = $month- abs($vnum);                 }                 $next = getDays($month,$year);//获取变换后月份的总天数                 if($next<$day){                     $day = $next;                 }             break;             case 'year':                 if($vnum >= 0){                     $year = $year+ abs($vnum);                 }else{                     $year = $year - abs($vnum);                 }             break;             default :             break;         }         $time = mktime(0,0,0,$month,$day,$year);         return date('Y-m-d',$time);     }     /\*\*      \* 查询字符是否存在于某字符串      \* @param $haystack 字符串      \* @param $needle 要查找的字符      \* @return bool      \*/     function strExists($haystack, $needle){         return !(strpos($haystack, $needle) === FALSE);     }     /\*\*      \* 取得文件扩展      \* @param $filename 文件名      \* @return 扩展名      \*/     function fileExt($filename) {         return strtolower(trim(substr(strrchr($filename, '.'), 1, 10)));     }     /\*\*      \* IE浏览器判断      \*/     function isIe() {         $useragent = strtolower($\_SERVER\['HTTP\_USER\_AGENT'\]);         if((strpos($useragent, 'opera') !== false) || (strpos($useragent, 'konqueror') !== false)) return false;         if(strpos($useragent, 'msie ') !== false) return true;         return false;     }     /\*\*      \* 文件下载      \* @param $filepath 文件路径      \* @param $filename 文件名称      \*/     function fileDown($filepath, $filename = '') {         if(!$filename) $filename = basename($filepath);         if(is\_ie()) $filename = rawurlencode($filename);         $filetype = fileext($filename);         $filesize = sprintf("%u", filesize($filepath));         if(ob\_get\_length() !== false) @ob\_end\_clean();         header('Pragma: public');         header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');         header('Cache-Control: no-store, no-cache, must-revalidate');         header('Cache-Control: pre-check=0, post-check=0, max-age=0');         header('Content-Transfer-Encoding: binary');         header('Content-Encoding: none');         header('Content-type: '.$filetype);         header('Content-Disposition: attachment; filename="'.$filename.'"');         header('Content-length: '.$filesize);         readfile($filepath);         exit;     }     /\*\*      \* 判断字符串是否为utf8编码,英文和半角字符返回ture      \* @param $string      \* @return bool      \*/     function isUtf8($string) {         return preg\_match('%^(?:                         \[\\x09\\x0A\\x0D\\x20-\\x7E\] # ASCII                         | \[\\xC2-\\xDF\]\[\\x80-\\xBF\] # non-overlong 2-byte                         | \\xE0\[\\xA0-\\xBF\]\[\\x80-\\xBF\] # excluding overlongs                         | \[\\xE1-\\xEC\\xEE\\xEF\]\[\\x80-\\xBF\]{2} # straight 3-byte                         | \\xED\[\\x80-\\x9F\]\[\\x80-\\xBF\] # excluding surrogates                         | \\xF0\[\\x90-\\xBF\]\[\\x80-\\xBF\]{2} # planes 1-3                         | \[\\xF1-\\xF3\]\[\\x80-\\xBF\]{3} # planes 4-15                         | \\xF4\[\\x80-\\x8F\]\[\\x80-\\xBF\]{2} # plane 16                         )\*$%xs', $string);     }     /\*\*      \* 检查密码长度是否符合规定      \*      \* @param   STRING $password      \* @return  TRUE or FALSE      \*/     function isPassword($password) {         $strlen = strlen($password);         if($strlen >= 6 && $strlen <= 20) return true;         return false;     }      /\*\*      \* 检测输入中是否含有特殊字符      \*      \* @param char $string 要检查的字符串名称      \* @return TRUE or FALSE      \*/     function isBadword($string) {         $badwords = array("\\\\",'&',' ',"'",'"','/','\*',',','',"\\r","\\t","\\n","#");         foreach($badwords as $value){             if(strpos($string, $value) !== FALSE) {                 return TRUE;             }         }         return FALSE;     }     /\*\*      \* 检查用户名是否符合规定      \*      \* @param STRING $username 要检查的用户名      \* @return     TRUE or FALSE      \*/     function isUsername($username) {         $strlen = strlen($username);         if(is\_badword($username) || !preg\_match("/^\[a-zA-Z0-9\_\\x7f-\\xff\]\[a-zA-Z0-9\_\\x7f-\\xff\]+$/", $username)){             return false;         }         elseif ( 20 < $strlen || $strlen < 2 ) {             return false;         }         return true;     }     /\*\*      \* 对数据进行编码转换      \* @param array/string $data       数组      \* @param string $input     需要转换的编码      \* @param string $output    转换后的编码      \*/     function arrayIconv($data, $input = 'gbk', $output = 'utf-8') {         if (!is\_array($data)) {             return iconv($input, $output, $data);         }         else{             foreach ($data as $key=>$val) {                 if(is\_array($val)) {                     $data\[$key\] = array\_iconv($val, $input, $output);                 } else {                     $data\[$key\] = iconv($input, $output, $val);                 }             }             return $data;         }     }     /\*\*      \*      \* 抓取远程内容      \* @param $url 接口url地址      \* @param $timeout 超时时间      \*/     function pcFileGetContents($url, $timeout=30) {         $stream = stream\_context\_create(array('http' => array('timeout' => $timeout)));         return @file\_get\_contents($url, 0, $stream);     }     /\*\*      \* Function dataformat      \* 时间转换      \* @param $n INT时间      \*/     function dataFormat($n) {         $hours = floor($n/3600);         $minite    = floor($n%3600/60);         $secend = floor($n%3600%60);         $minite = $minite < 10 ? "0".$minite : $minite;         $secend = $secend < 10 ? "0".$secend : $secend;         if($n >= 3600){             return $hours.":".$minite.":".$secend;         }else{             return $minite.":".$secend;         }     } \---------------------  /\*\*     \* 生成订单15位     \*/     function setUpOrder($ord = 0) {         //自动生成订单号  传入参数为0 或者1   0为本地  1为线上订单         if ($ord == 0) {             $str = '00' . time() . rand(1000, 9999); //00 本地订单         }         else {             $str = '99' . time() . rand(1000, 9999);  //11 线上订单         }         return $str;     }     /\*\*     \* 处理json字符中的特殊字符     \* @param 需要处理的json PHP > 5.2 json\_encode 知道转义     \*/     function getJsonToArr($value) {         $escapers = array("\\\\", "/", "\\"", "\\n", "\\r", "\\t", "\\x08", "\\x0c");         $replacements = array("\\\\\\\\", "\\\\/", "\\\\\\"", "\\\\n", "\\\\r", "\\\\t", "\\\\f", "\\\\b");         $result = str\_replace($escapers, $replacements, $value);         return $result;     }     /\*\*     \* 非法字符过滤函数     \* @param 过滤字符串     \*/     function hasUnsafeword($str) {         $regex = "/\\/|\\~|\\!|\\@|\\#|\\\\$|\\%|\\^|\\&|\\\*|\\(|\\)|\\\_|\\+|\\{|\\}|\\:|\\|\\?|\\\[|\\\]|\\.|\\/|\\;|\\'|\\`|\\=|\\\\\\|\\|/";         return preg\_replace($regex,"",$str);       }     /\*\*     \* 去空格,以及字符添加斜杠     \*/     function clearTrim(&$value) {         Return addslashes(trim($value));     }     /\*\*      \* 数组降维      \* @param  Array $arr      \* @return Array      \*/     function arrMd2Ud($arr) {         #将数值第一元素作为容器,作地址赋值。         $ar\_room = &$arr\[key($arr)\];         #第一容器不是数组进去转呀         if (!is\_array($ar\_room)) {             #转为成数组             $ar\_room = array($ar\_room);         }         #指针下移         next($arr);         #遍历         while (list($k, $v) = each($arr)) {             #是数组就递归深挖,不是就转成数组             $v = is\_array($v) ? call\_user\_func(\_\_FUNCTION\_\_, $v) : array($v);             #递归合并             $ar\_room = array\_merge\_recursive($ar\_room, $v);             #释放当前下标的数组元素             unset($arr\[$k\]);         }         return $ar\_room;     }     /\*\*      \* 判断是PC端还是wap端访问      \* @return type判断手机移动设备访问      \*/     function isMobile()     {         // 如果有HTTP\_X\_WAP\_PROFILE则一定是移动设备         if (isset ($\_SERVER\['HTTP\_X\_WAP\_PROFILE'\]))         {             return true;         }         // 如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息         if (isset ($\_SERVER\['HTTP\_VIA'\]))         {             // 找不到为flase,否则为true             return stristr($\_SERVER\['HTTP\_VIA'\], "wap") ? true : false;         }         // 脑残法,判断手机发送的客户端标志,兼容性有待提高         if (isset ($\_SERVER\['HTTP\_USER\_AGENT'\]))         {             $clientkeywords = array ('nokia',                 'sony',                 'ericsson',                 'mot',                 'samsung',                 'htc',                 'sgh',                 'lg',                 'sharp',                 'sie-',                 'philips',                 'panasonic',                 'alcatel',                 'lenovo',                 'iphone',                 'ipod',                 'blackberry',                 'meizu',                 'android',                 'netfront',                 'symbian',                 'ucweb',                 'windowsce',                 'palm',                 'operamini',                 'operamobi',                 'openwave',                 'nexusone',                 'cldc',                 'midp',                 'wap',                 'mobile'                 );             // 从HTTP\_USER\_AGENT中查找手机浏览器的关键字             if (preg\_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($\_SERVER\['HTTP\_USER\_AGENT'\])))             {                 return true;             }         }         // 协议法,因为有可能不准确,放到最后判断         if (isset ($\_SERVER\['HTTP\_ACCEPT'\]))         {             // 如果只支持wml并且不支持html那一定是移动设备             // 如果支持wml和html但是wml在html之前则是移动设备             if ((strpos($\_SERVER\['HTTP\_ACCEPT'\], 'vnd.wap.wml') !== false) && (strpos($\_SERVER\['HTTP\_ACCEPT'\], 'text/html') === false || (strpos($\_SERVER\['HTTP\_ACCEPT'\], 'vnd.wap.wml') < strpos($\_SERVER\['HTTP\_ACCEPT'\], 'text/html'))))             {                 return true;             }         }         return false;     }     /\*\*     \* 判断是否为安卓手机     \*/     function isAndroid()     {         if(isset($\_SERVER\['HTTP\_USER\_AGENT'\])){             $agent = strtolower($\_SERVER\['HTTP\_USER\_AGENT'\]);             if(strpos($agent,'android') !== false)                 return true;         }         return false;     }     /\*\*     \* 判断是否为iphone或者ipad     \*/     function isIos()     {         if(isset($\_SERVER\['HTTP\_USER\_AGENT'\])){             $agent = strtolower($\_SERVER\['HTTP\_USER\_AGENT'\]);             if(strpos($agent, 'iphone')||strpos($agent, 'ipad'))                 return true;         }         return false;     }     /\*\*     \* 判断是否是微信浏览器还是企业微信浏览器     \*/     function isWxbrowser()     {         if ( strpos($\_SERVER\['HTTP\_USER\_AGENT'\], 'MicroMessenger') !== false ) {              return true;          }          else{              return false;          }     }     /\*\*     \* 判断是否是企业微信浏览器     \*/     function isWxCompany()     {         if( strpos($\_SERVER\['HTTP\_USER\_AGENT'\], 'wxwork') !== false ) {              return true;          }          else{              return false;          }     }     /\*\*     \* 整合到一起,判断当前设备,1:安卓;2:IOS;3:微信;0:未知     \*/     function isDevice()     {         if($\_SERVER\['HTTP\_USER\_AGENT'\]){             $agent = strtolower($\_SERVER\['HTTP\_USER\_AGENT'\]);             if(strpos($agent, 'micromessenger') !== false)                 return 3;             elseif(strpos($agent, 'iphone')||strpos($agent, 'ipad'))                 return 2;             else                 return 1;         }         return 0;     }     /\*\*      \* 日期转换成几分钟前      \*/     function formatTime($date) {         $timer = strtotime($date);         $diff = $\_SERVER\['REQUEST\_TIME'\] - $timer;         $day = floor($diff / 86400);         $free = $diff % 86400;         if($day > 0) {             if(15 < $day && $day <30){                 return "半个月前";             }elseif(30 <= $day && $day <90){                 return "1个月前";             }elseif(90 <= $day && $day <187){                 return "3个月前";             }elseif(187 <= $day && $day <365){                 return "半年前";             }elseif(365 <= $day){                 return "1年前";             }else{                 return $day."天前";             }         }else{             if($free>0){                 $hour = floor($free / 3600);                 $free = $free % 3600;                 if($hour>0){                     return $hour."小时前";                 }else{                     if($free>0){                         $min = floor($free / 60);                         $free = $free % 60;                     if($min>0){                         return $min."分钟前";                     }else{                         if($free>0){                             return $free."秒前";                         }else{                             return '刚刚';                         }                     }                     }else{                         return '刚刚';                     }                 }             }else{                 return '刚刚';             }         }     }     /\*\*     \* 字符串截取     \* @param String 被截取的字符串     \* @param Int    截取长度     \*/     function getStrTruncate($string, $length = '', $etc = ''){           if ($length == 0) return '';           mb\_internal\_encoding("UTF-8");           $string = str\_replace("\\n","",$string);           $strlen = mb\_strwidth($string);           if ($strlen > $length) {             $etclen = mb\_strwidth($etc);             $length = $length - $etclen;             $str=''; $n = 0;             for($i=0; $i<$length; $i++) {               $c = mb\_substr($string, $i, 1);               $n += mb\_strwidth($c);               if ($n>$length) { break; }               $str .= $c;             }             return $str.$etc;           }           else{             return $string;           }     }     /\*\*     \* 删除目录 比如缓存     \* @param $dir 目录     \*/     function destroyDir($dir, $virtual = false){        $ds = DIRECTORY\_SEPARATOR;        $dir = $virtual ? realpath($dir) : $dir;        $dir = substr($dir, -1) == $ds ? substr($dir, 0, -1) : $dir;        if (is\_dir($dir) && $handle = opendir($dir))        {            while ($file = readdir($handle))            {                if ($file == '.' || $file == '..')                {                    continue;                }                elseif (is\_dir($dir.$ds.$file)){                    destroyDir($dir.$ds.$file);                }                else{                    unlink($dir.$ds.$file);                }            }            closedir($handle);            rmdir($dir);            return true;        }        else{            return false;        }     }     /\*\*     \* 防SQL 注入     \*/     function injCheck($sql\_str) {          $check = preg\_match('/select|insert|update|delete|\\'|\\/\\\*|\\\*|\\.\\.\\/|\\.\\/|union|into|load\_file|outfile/', $sql\_str);         if ($check) {             echo '非法字符!!';             exit;         }         else{             return $sql\_str;         }     }     /\*\*     \* 对象转数组     \*/     function objectToArray($obj){         $\_arr = is\_object($obj) ? get\_object\_vars($obj) : $obj;         foreach ($\_arr as $key => $val){             $val = (is\_array($val) || is\_object($val)) ? object\_to\_array($val) : $val;             $arr\[$key\] = $val;         }         return $arr;     }     /\*\*     \* 判断两个字符串是否相等     \*/     function stringEqual($str1,$str2){         if(strcmp($str1,$str2) == 0){             return true;         }         else{             return false;         }     }     /\*\*      \* 递归重组信息为多维      \* @param string $dirName 路径      \* @param boolean $fileFlag 是否删除目录      \* @return void      \*/     function nodeMerge($attr, $arr) {         foreach($attr as $v){             if (is\_array($arr)){                 $v\['access'\] = in\_array($v\['id'\],$arr) ? 1: 0;             }         }         return $attr;     }     /\*\*      \* 获取文件信息      \* @param string $filepath 路径      \* @param string $key 指定返回某个键值信息      \* @return array      \*/     function get\_file\_info($filepath='', $key=''){         //打开文件,r表示以只读方式打开         $handle = fopen($filepath,"r");         //获取文件的统计信息         $fstat = fstat($handle);         fclose($handle);         $fstat\['filename'\] = basename($filepath);         if(!empty($key)){             return $fstat\[$key\];         }else{             return $fstat;         }     }     /\*\*     \* 对查询结果集进行排序     \* @param array $list 查询结果     \* @param string $field 排序的字段名     \* @param array $sortby 排序类型     \* asc正向排序 desc逆向排序 nat自然排序     \* @return array     \*/     function listSortBy($list,$field, $sortby='asc') {        if(is\_array($list)){            $refer = $resultSet = array();            foreach ($list as $i => $data)                $refer\[$i\] = &$data\[$field\];            switch ($sortby) {                case 'asc': // 正向排序                     asort($refer);                     break;                case 'desc':// 逆向排序                     arsort($refer);                     break;                case 'nat': // 自然排序                     natcasesort($refer);                     break;            }            foreach ( $refer as $key=> $val)                $resultSet\[\] = &$list\[$key\];            return $resultSet;        }        return false;     }     /\*\*      \* 把返回的数据集转换成Tree      \* @param array $list 要转换的数据集      \* @param string $pid parent标记字段      \* @param string $level level标记字段      \* @return array      \*/     function listToTree($list, $pk='id', $pid = 'pid', $child = '\_child', $root = 0) {         // 创建Tree         $tree = array();         if(is\_array($list)) {             // 创建基于主键的数组引用             $refer = array();             foreach ($list as $key => $val) {                 $refer\[$val\[$pk\]\] =& $list\[$key\];             }             foreach ($list as $key => $val) {                 // 判断是否存在parent                 $parentId =  $val\[$pid\];                 if ($root == $parentId) {                     $tree\[\] =& $list\[$key\];                 }else{                     if (isset($refer\[$parentId\])) {                         $parent =& $refer\[$parentId\];                         $parent\[$child\]\[\] =& $list\[$key\];                     }                 }             }         }         return $tree;     }     /\*\*      \* 将list\_to\_tree的树还原成列表      \* @param  array $tree  原来的树      \* @param  string $child 孩子节点的键      \* @param  string $order 排序显示的键,一般是主键 升序排列      \* @param  array  $list  过渡用的中间数组,      \* @return array        返回排过序的列表数组      \*/     function treeToList($tree, $child = '\_child', $order='id', &$list = array()){         if(is\_array($tree)) {             $refer = array();             foreach ($tree as $key => $value) {                 $reffer = $value;                 if(isset($reffer\[$child\])){                     unset($reffer\[$child\]);                     tree\_to\_list($value\[$child\], $child, $order, $list);                 }                 $list\[\] = $reffer;             }             $list = list\_sort\_by($list, $order, $sortby='asc');         }         return $list;     } \---------------------