技术QQ交流群:294088839
//拼接路径
protected function lujing($url,$data){ksort($data);
$str='';
foreach ($data as $key => $value) {
$str .= '&' . $this->percentEncode($key). '=' . $this->percentEncode($value);
}
$str=trim($str,'&');
$urlHao=$url.'?'.$str;
return $urlHao;
}
//进行Signature签名接过串加密
private function computeSignature($method,$parameters,$AccessKeySecret){ksort($parameters);
$canonicalizedQueryString = '';
foreach ($parameters as $key => $value) {
$canonicalizedQueryString .= '&' . $this->percentEncode($key). '=' . $this->percentEncode($value);
}
$stringToSign = $method.'&%2F&' . $this->percentencode(substr($canonicalizedQueryString, 1));
$signature = $this->signString($stringToSign, $AccessKeySecret."&");
return $signature;
}
//解析路径里的特殊符号
protected function percentEncode($str){$res = urlencode($str);
$res = preg_replace('/\+/', '%20', $res);
$res = preg_replace('/\*/', '%2A', $res);
$res = preg_replace('/%7E/', '~', $res);
return $res;
}
//生成签名字符串
protected function signString($stringToSign,$AccessKeySecret){return base64_encode(hash_hmac('sha1', $stringToSign, $AccessKeySecret, true));
}
//获取UTC格式的时间
private function utc_time(){date_default_timezone_set('UTC');
$timestamp = new \DateTime();
$timeStr = $timestamp->format("Y-m-d\TH:i:s\Z");
return $timeStr;
}
//随机数
private function clientToken(){return $clientToken=md5(uniqid(mt_rand(), true));
}
/**
* @param $arr
* @param $key_name
* @return array
* 将数据库中查出的列表以指定的 id 作为数组的键名
*/function convert_arr_key($arr, $key_name)
{
$arr2 = array();
foreach($arr as $key => $val)
{
$arr2[$val[$key_name]] = $val;
}
return $arr2;
}
/**
* 对str字符串进行加密,并返回加密过后的字符串
* @param unknown $str 加密后的字符串*/
function encrypt($str)
{
return md5($str);//'AUTH_CODE' => "TPSHOP"
}
/**
* 获取数组中的某一列
* @param type $arr 数组* @param type $key_name 列名
* @return type 返回那一列的数组
*/
function get_arr_column($arr, $key_name)
{
$arr2 = array();
foreach($arr as $key => $val)
{
$arr2[] = $val[$key_name];
}
return $arr2;
}
/**
* 获取url 中的各个参数 类似于 pay_code=alipay&bank_code=ICBC-DEBIT
* @param type $str* @return type
*/
function parse_url_param($str)
{
$data = array();
$parameter = explode('&',end(explode('?',$str)));
foreach($parameter as $val)
{
$tmp = explode('=',$val);
$data[$tmp[0]] = $tmp[1];
}
return $data;
}
/**
* 二维数组排序
* @param $arr* @param $keys
* @param string $type
* @return array
*/
function array_sort($arr, $keys, $type = 'desc')
{
$key_value = $new_array = array();
foreach ($arr as $k => $v) {
$key_value[$k] = $v[$keys];
}
if ($type == 'asc') {
asort($key_value);
} else {
arsort($key_value);
}
reset($key_value);
foreach ($key_value as $k => $v) {
$new_array[$k] = $arr[$k];
}
return $new_array;
}
/**
* 多维数组转化为一维数组
* @param 多维数组* @return array 一维数组
*/
function array_multi2single($array)
{
static $result_array = array();
foreach ($array as $value) {
if (is_array($value)) {
array_multi2single($value);
} else
$result_array [] = $value;
}
return $result_array;
}
/**
* 友好时间显示
* @param $time* @return bool|string
*/
function friend_date($time)
{
if (!$time)
return false;
$fdate = '';
$d = time() - intval($time);
$ld = $time - mktime(0, 0, 0, 0, 0, date('Y')); //得出年
$md = $time - mktime(0, 0, 0, date('m'), 0, date('Y')); //得出月
$byd = $time - mktime(0, 0, 0, date('m'), date('d') - 2, date('Y')); //前天
$yd = $time - mktime(0, 0, 0, date('m'), date('d') - 1, date('Y')); //昨天
$dd = $time - mktime(0, 0, 0, date('m'), date('d'), date('Y')); //今天
$td = $time - mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')); //明天
$atd = $time - mktime(0, 0, 0, date('m'), date('d') + 2, date('Y')); //后天
if ($d == 0) {
$fdate = '刚刚';
} else {
switch ($d) {
case $d < $atd:
$fdate = date('Y年m月d日', $time);
break;
case $d < $td:
$fdate = '后天' . date('H:i', $time);
break;
case $d < 0:
$fdate = '明天' . date('H:i', $time);
break;
case $d < 60:
$fdate = $d . '秒前';
break;
case $d < 3600:
$fdate = floor($d / 60) . '分钟前';
break;
case $d < $dd:
$fdate = floor($d / 3600) . '小时前';
break;
case $d < $yd:
$fdate = '昨天' . date('H:i', $time);
break;
case $d < $byd:
$fdate = '前天' . date('H:i', $time);
break;
case $d < $md:
$fdate = date('m月d日 H:i', $time);
break;
case $d < $ld:
$fdate = date('m月d日', $time);
break;
default:
$fdate = date('Y年m月d日', $time);
break;
}
}
return $fdate;
}
/**
* 返回状态和信息
* @param $status* @param $info
* @return array
*/
function arrayRes($status, $info, $url = "")
{
return array("status" => $status, "info" => $info, "url" => $url);
}
/**
* @param $arr
* @param $key_name
* @param $key_name2
* @return array
* 将数据库中查出的列表以指定的 id 作为数组的键名 数组指定列为元素 的一个数组
*/function get_id_val($arr, $key_name,$key_name2)
{
$arr2 = array();
foreach($arr as $key => $val){
$arr2[$val[$key_name]] = $val[$key_name2];
}
return $arr2;
}
/**
* 自定义函数 判断 用户选择 从下面的列表中选择 可选值列表:不能为空
* @param type $attr_values* @return boolean
*/
function checkAttrValues($attr_values)
{
if((trim($attr_values) == '') && ($_POST['attr_input_type'] == '1'))
return false;
else
return true;
}
// 定义一个函数getIP() 客户端IP,
function getIP(){if (getenv("HTTP_CLIENT_IP"))
$ip = getenv("HTTP_CLIENT_IP");
else if(getenv("HTTP_X_FORWARDED_FOR"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if(getenv("REMOTE_ADDR"))
$ip = getenv("REMOTE_ADDR");
else $ip = "Unknow";
return $ip;
}
// 服务器端IP
function serverIP(){return gethostbyname($_SERVER["SERVER_NAME"]);
}
/**
* 自定义函数递归的复制带有多级子目录的目录
* 递归复制文件夹
* @param type $src 原目录
* @param type $dst 复制到的目录
*/
//参数说明:
//自定义函数递归的复制带有多级子目录的目录
function recurse_copy($src, $dst){
$now = time();
$dir = opendir($src);
@mkdir($dst);
while (false !== $file = readdir($dir)) {
if (($file != '.') && ($file != '..')) {
if (is_dir($src . '/' . $file)) {
recurse_copy($src . '/' . $file, $dst . '/' . $file);
}
else {
if (file_exists($dst . DIRECTORY_SEPARATOR . $file)) {
if (!is_writeable($dst . DIRECTORY_SEPARATOR . $file)) {
exit($dst . DIRECTORY_SEPARATOR . $file . '不可写');
}
@unlink($dst . DIRECTORY_SEPARATOR . $file);
}
if (file_exists($dst . DIRECTORY_SEPARATOR . $file)) {
@unlink($dst . DIRECTORY_SEPARATOR . $file);
}
$copyrt = copy($src . DIRECTORY_SEPARATOR . $file, $dst . DIRECTORY_SEPARATOR . $file);
if (!$copyrt) {
echo 'copy ' . $dst . DIRECTORY_SEPARATOR . $file . ' failed<br>';
}
}
}
}
closedir($dir);
}
//递归删除文件夹
function delFile($dir,$file_type=''){
if(is_dir($dir))
{
$files = scandir($dir);
//打开目录 //列出目录中的所有文件并去掉 . 和 ..
foreach($files as $filename)
{
if($filename!='.' && $filename!='..')
{
if(!is_dir($dir.'/'.$filename))
{
if(empty($file_type))
{
unlink($dir.'/'.$filename);
}
else
{
if(is_array($file_type))
{
//正则匹配指定文件
if(preg_match($file_type[0],$filename))
{
unlink($dir.'/'.$filename);
}
}
else
{
//指定包含某些字符串的文件
if(false!=stristr($filename,$file_type))
{
unlink($dir.'/'.$filename);
}
}
}
}
else
{
delFile($dir.'/'.$filename);
rmdir($dir.'/'.$filename);
}
}
}
}
else
{
if(file_exists($dir))
{
unlink($dir);
}
}
}
/**
* 多个数组的笛卡尔积
** @param unknown_type $data
*/
function combineDika()
{
$data = func_get_args();
$data = current($data);
$cnt = count($data);
$result = array();
$arr1 = array_shift($data);
foreach($arr1 as $key => $item)
{
$result[] = array($item);
}
foreach($data as $key => $item)
{
$result = combineArray($result,$item);
}
return $result;
}
/**
* 两个数组的笛卡尔积
* @param unknown_type $arr1* @param unknown_type $arr2
*/
function combineArray($arr1,$arr2)
{
$result = array();
foreach ($arr1 as $item1)
{
foreach ($arr2 as $item2)
{
$temp = $item1;
$temp[] = $item2;
$result[] = $temp;
}
}
return $result;
}
/**
* 将二维数组以元素的某个值作为键 并归类数组
* array( array('name'=>'aa','type'=>'pay'), array('name'=>'cc','type'=>'pay') )* array('pay'=>array( array('name'=>'aa','type'=>'pay') , array('name'=>'cc','type'=>'pay') ))
* @param $arr 数组
* @param $key 分组值的key
* @return array
*/
function group_same_key($arr,$key){
$new_arr = array();
foreach($arr as $k=>$v ){
$new_arr[$v[$key]][] = $v;
}
return $new_arr;
}
/**
* 获取随机字符串
* @param int $randLength 长度* @param int $addtime 是否加入当前时间戳
* @param int $includenumber 是否包含数字
* @return string
*/
function get_rand_str($randLength=6,$addtime=1,$includenumber=0)
{
if ($includenumber)
{
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQEST123456789';
}
else
{
$chars = 'abcdefghijklmnopqrstuvwxyz';
}
$len = strlen($chars);
$randStr = '';
for ($i = 0;$i < $randLength;$i++)
{
$randStr .= $chars[rand(0,$len - 1)];
}
$tokenvalue = $randStr;
if ($addtime)
{
$tokenvalue = $randStr.time();
}
return $tokenvalue;
}
/**
* CURL请求
* @param $url 请求url地址* @param $method 请求方法 get post
* @param null $postfields post数据数组
* @param array $headers 请求header信息
* @param bool|false $debug 调试开启 默认false
* @return mixed
*/
function httpRequest($url, $method, $postfields = null, $headers = array(), $debug = false) {
$method = strtoupper($method);
$ci = curl_init();
/* Curl settings */
curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
curl_setopt($ci, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0");
curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 60); /* 在发起连接前等待的时间,如果设置为0,则无限等待 */
curl_setopt($ci, CURLOPT_TIMEOUT, 7); /* 设置cURL允许执行的最长秒数 */
curl_setopt($ci, CURLOPT_RETURNTRANSFER, true);
switch ($method) {
case "POST":
curl_setopt($ci, CURLOPT_POST, true);
if (!empty($postfields)) {
$tmpdatastr = is_array($postfields) ? http_build_query($postfields) : $postfields;
curl_setopt($ci, CURLOPT_POSTFIELDS, $tmpdatastr);
}
break;
default:
curl_setopt($ci, CURLOPT_CUSTOMREQUEST, $method); /* //设置请求方式 */
break;
}
$ssl = preg_match('/^https:\/\//i',$url) ? TRUE : FALSE;
curl_setopt($ci, CURLOPT_URL, $url);
if($ssl){
curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts
curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, FALSE); // 不从证书中检查SSL加密算法是否存在
}
//curl_setopt($ci, CURLOPT_HEADER, true); /*启用时会将头文件的信息作为数据流输出*/
curl_setopt($ci, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ci, CURLOPT_MAXREDIRS, 2);/*指定最多的HTTP重定向的数量,这个选项是和CURLOPT_FOLLOWLOCATION一起使用的*/
curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ci, CURLINFO_HEADER_OUT, true);
/*curl_setopt($ci, CURLOPT_COOKIE, $Cookiestr); * *COOKIE带过去** */
$response = curl_exec($ci);
$requestinfo = curl_getinfo($ci);
$http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
if ($debug) {
echo "=====post data======\r\n";
var_dump($postfields);
echo "=====info===== \r\n";
print_r($requestinfo);
echo "=====response=====\r\n";
print_r($response);
}
curl_close($ci);
return $response;
//return array($http_code, $response,$requestinfo);
}
/**
* 过滤数组元素前后空格 (支持多维数组)
* @param $array 要过滤的数组* @return array|string
*/
function trim_array_element($array){
if(!is_array($array))
return trim($array);
return array_map('trim_array_element',$array);
}
/**
* 检查手机号码格式
* @param $mobile 手机号码*/
function check_mobile($mobile)
{
if(preg_match('/1[34578]\d{9}$/',$mobile))
{
return true;
}
return false;
}
/**
* 检查邮箱地址格式
* @param $email 邮箱地址*/
function check_email($email){
if(filter_var($email,FILTER_VALIDATE_EMAIL))
return true;
return false;
}
/**
* 实现中文字串截取无乱码的方法
*/function getSubstr($string, $start, $length) {
if(mb_strlen($string,'utf-8')>$length){
$str = mb_substr($string, $start, $length,'utf-8');
return $str.'...';
}else{
return $string;
}
}
/**
* 判断当前访问的用户是 PC端 还是 手机端 返回true 为手机端 false 为PC 端
* @return boolean*/
function isMobile(){
$useragent=isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
$useragent_commentsblock=preg_match('|\(.*?\)|',$useragent,$matches)>0?$matches[0]:'';
function CheckSubstrs($substrs,$text){
foreach($substrs as $substr)
if(false!==strpos($text,$substr)){
return true;
}
return false;
}
$mobile_os_list=array('Google Wireless Transcoder','Windows CE','WindowsCE','Symbian','Android','armv6l','armv5','Mobile','CentOS','mowser','AvantGo','Opera Mobi','J2ME/MIDP','Smartphone','Go.Web','Palm','iPAQ');
$mobile_token_list=array('Profile/MIDP','Configuration/CLDC-','160×160','176×220','240×240','240×320','320×240','UP.Browser','UP.Link','SymbianOS','PalmOS','PocketPC','SonyEricsson','Nokia','BlackBerry','Vodafone','BenQ','Novarra-Vision','Iris','NetFront','HTC_','Xda_','SAMSUNG-SGH','Wapaka','DoCoMo','iPhone','iPod');
$found_mobile=CheckSubstrs($mobile_os_list,$useragent_commentsblock) ||
CheckSubstrs($mobile_token_list,$useragent);
if ($found_mobile){
return true;
}else{
return false;
}
}
//php获取中文字符拼音首字母
function getFirstCharter($str){
if(empty($str))
{
return '';
}
$fchar=ord($str{0});
if($fchar>=ord('A')&&$fchar<=ord('z')) return strtoupper($str{0});
$s1=iconv('UTF-8','gb2312',$str);
$s2=iconv('gb2312','UTF-8',$s1);
$s=$s2==$str?$s1:$str;
$asc=ord($s{0})*256+ord($s{1})-65536;
if($asc>=-20319&&$asc<=-20284) return 'A';
if($asc>=-20283&&$asc<=-19776) return 'B';
if($asc>=-19775&&$asc<=-19219) return 'C';
if($asc>=-19218&&$asc<=-18711) return 'D';
if($asc>=-18710&&$asc<=-18527) return 'E';
if($asc>=-18526&&$asc<=-18240) return 'F';
if($asc>=-18239&&$asc<=-17923) return 'G';
if($asc>=-17922&&$asc<=-17418) return 'H';
if($asc>=-17417&&$asc<=-16475) return 'J';
if($asc>=-16474&&$asc<=-16213) return 'K';
if($asc>=-16212&&$asc<=-15641) return 'L';
if($asc>=-15640&&$asc<=-15166) return 'M';
if($asc>=-15165&&$asc<=-14923) return 'N';
if($asc>=-14922&&$asc<=-14915) return 'O';
if($asc>=-14914&&$asc<=-14631) return 'P';
if($asc>=-14630&&$asc<=-14150) return 'Q';
if($asc>=-14149&&$asc<=-14091) return 'R';
if($asc>=-14090&&$asc<=-13319) return 'S';
if($asc>=-13318&&$asc<=-12839) return 'T';
if($asc>=-12838&&$asc<=-12557) return 'W';
if($asc>=-12556&&$asc<=-11848) return 'X';
if($asc>=-11847&&$asc<=-11056) return 'Y';
if($asc>=-11055&&$asc<=-10247) return 'Z';
return null;
}
/**
* 调试函数,打印变量
** @param $input
* @param $inputStr
*/
function printVar($input,$inputStr)
{
echo '<br><br>' . $inputStr . ' = ';
dump($input);
echo '<br><br>';
}
/**
* 根据bookID来获取书籍的封面
** @param $bookID
* @return mixed|string
*/
function getBookCoverUrl($bookID)
{
$tmpImgPath = '/' . floor($bookID / 1000) . '/' . $bookID. '/' . $bookID . "s.jpg";
if(file_exists(C('IMAGE_FILE_DIR') . $tmpImgPath))
{
$imgUrl = C('IMAGE_FILE_URL') . $tmpImgPath;
}
else
{
$imgUrl = C('DEFAULT_ARTICLE_COVER');
}
return $imgUrl;
}
/**
* 根据bookID来获取书籍的信息
** @param $bookID
* @return mixed
*/
function getBookInfo($bookID)
{
$bookInfo = M('article_article')->where(array('articleid' => $bookID))->getField('articleid,articlename,sortid,author,size,intro,display');
$bookInfo[$bookID]['sort'] = getSortName($bookInfo[$bookID]['sortid']);
// $bookInfo[$bookID]['intro'] = getBookIntro($bookInfo[$bookID]['intro']);
$bookInfo[$bookID]['intro'] = $bookInfo[$bookID]['intro'];
$bookInfo[$bookID]['size'] = getBookWordSum($bookInfo[$bookID]['size']);
return $bookInfo;
}
/**
* 根据sortID来获取书籍分类的名称
** @param $sortID
* @return mixed
*/
function getSortName($sortID)
{
$filePath = C('DIR_PATH') . C('SECONDE_SORT_FILE_PATH');
include $filePath;
if(isset($jieqiSort['article']) && $jieqiSort['article'])
{
$sortName = $jieqiSort['article'][$sortID]['caption'];
}
$sortName = iconv('GBK','UTF-8',$sortName);
return $sortName;
}
/**
* 截取30个字的简介
*/function getBookIntro($bookIntro)
{
if(strlen($bookIntro) > 40)
{
$bookIntro = mb_substr($bookIntro,0,40,'UTF-8');
$bookIntro .= '......';
}
return $bookIntro;
}
/**
* 获取书籍字数
*/function getBookWordSum($bookSize)
{
//将字数转化为万
$integer = ($bookSize / 2) / 10000;//整数
if($integer >= 1.0)
{
$decimal = ($bookSize / 2) % 10000;//小数
$result = number_format(floatval($integer . '.' . $decimal),2) . '万字';//小说字数
}
else
{
$result = intval($bookSize / 2) . '个字';//小说字数
}
return $result;
}
/**
* 根据$bookList来获取书籍信息
** @param $bookList
* @return array
*/
function getBookInfoFromBookList($bookList)
{
foreach($bookList as $item)
{
$flag = articleExist($item);
if($flag)
{
$tmpBook['bookid'] = $item;
$tmpBook['cover'] = getBookCoverUrl($item);
$bookInfo = getBookInfo($item);
$tmpBook['info'] = $bookInfo[$item];
$tmpBook['url'] = U('Article/index',array('id' => $item));
$resultBookList[] = $tmpBook;
}
}
return $resultBookList;
}
/**
* 判断书籍是否存在,存在则为true,不存在为false
** @param $articleID
* @return bool
*/
function articleExist($articleID)
{
$count = M('article_article')->where(array('articleid' => $articleID))->count();
//echo $count;exit;
$flag = true;
if(!$count)
{
$flag = false;
}
return $flag;
}
function articleExist1($articleID){
$map['articleid'] = array('in',$articleID);
$res = M('article_article')->field('articleid')->where($map)->select();
if(count($res)==0){
$res = false;
}
return $res;
}
//通过拼接路径get传输访问 url写法
function url($url){
header("Content-type: text/html; charset=UTF-8");
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_HEADER, false);
///curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 10 );
// curl_setopt ( $ch, CURLOPT_POST, 1 ); //启用POST提交
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// curl_setopt( $ch, CURLOPT_POSTFIELDS, $map);
$return_str = curl_exec ( $ch );
curl_close ( $ch );
return $return_str;
// parse_str($return_str, $arr1);
// $arr2=json_encode($arr1);
}
/*
用户post的数据 访问 url
*/
function PostData($params)
{
//构造要post的字符串
$length = strlen($params);
//以下参数请按最终 API 发布地址进行修改
$apiHost = "api.22.cn";
$apiPort = 80;
$apiUrl = "/OpenAPI.aspx";
$fp = fsockopen($apiHost,$apiPort,$errno,$errstr,10) or exit($errstr."--->".$errno);
//构造post请求的头
$header = "POST ". $apiUrl . " HTTP/1.1\r\n";
$header .= "Host:" . $apiHost . "\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: ".$length."\r\n";
$header .= "Connection: Close\r\n\r\n";
//添加post的字符串
$header .= $params."\r\n";
//发送post的数据
fputs($fp,$header);
$inheader = 1;
$ret="";
while (!feof($fp)) {
$line = fgets($fp,1024); //去除请求包的头只显示页面的返回数据
if ($inheader && ($line == "\n" || $line == "\r\n")) {
$inheader = 0;
}
if ($inheader == 0) {
$ret.=$line;
}
}
fclose($fp);
// $ret = iconv("UTF-8","GB2312",$ret);
//$ret = iconv("BGK","UTF-8",$ret);
// $ret = iconv("GB2312","UTF-8",$ret);
return $ret;
}
/**
* 格式化字节大小
* @param number $size 字节数* @param string $delimiter 数字和单位分隔符
* @return string 格式化后的带单位的大小
*/
function byteformat($size, $delimiter = '') {
$units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB');
for ($i = 0; $size >= 1024 && $i < 5; $i++)
$size /= 1024;
return round($size, 2) . $delimiter . $units[$i];
}
/**
* 作用:格式化参数,签名过程需要使用
*/function formatBizQueryParaMap($paraMap, $urlencode)
{
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v)
{
if($urlencode)
{
$v = urlencode($v);
}
//$buff .= strtolower($k) . "=" . $v . "&";
$buff .= $k . "=" . $v . "&";
}
$reqPar;
if (strlen($buff) > 0)
{
$reqPar = substr($buff, 0, strlen($buff)-1);
}
return $reqPar;
}
//将数组生成xml
function arrayToXml($arr){
$xml = "<xml>";
foreach ($arr as $key=>$val)
{
if (is_numeric($val))
{
$xml.="<".$key.">".$val."</".$key.">";
}
else
$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
}
$xml.="</xml>";
return $xml;
}
/**
* 将xml转为array
* @param string $xml* @throws WxPayException
*/
function FromXml($xml)
{
if(!$xml){
throw new WxPayException("xml数据异常!");
}
//将XML转为array
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $values;
}
//过滤ip
function get_now_ip_list(){
$a = shell_exec('sudo ifconfig');
preg_match_all('/(dt_\d+)[\s\S]*?inet addr\:(\d{1,3}\.\d{1,3}.\d{1,3}.\d{1,3})[\s\S]*?P\-t\-P\:(\d{1,3}\.\d{1,3}.\d{1,3}.\d{1,3})/', $a, $ips);
unset($ips[0]);
$arr=[];
foreach($ips[1] as $val){
$arr[]= [
'name' => isset($val) ? $val : '',//网卡名字
];
}
foreach($ips[2] as $key=>$val){
$arr[$key]['ip']=isset($val) ? $val : '';
}
foreach($ips[3] as $key=>$val){
$arr[$key]['gateway']=isset($val) ? $val : '';
}
return $arr;
}
//获取随机端口号 写入文件 尽量做到打开一次 全部写入再进行关闭
function port(){//随机生成端口号范围 (1001-65535) 防止重复
$file= fopen("/etc/squid/dt.conf", "r");
$info=fread($file,filesize("/etc/squid/dt.conf"));
$port=rand(1001,65535);
$num=strrpos($info,$port);
while(!empty($num)){
$port=rand(1001,65535);
$num=strrpos($info,$port);
}
fclose($file);
return $port;
}
//PHP遍历一个文件夹下所有文件和子文件夹的函数
function my_dir($dir) { $files = array(); if(@$handle = opendir($dir)) { //注意这里要加一个@,不然会有warning错误提示:) while(($file = readdir($handle)) != = false) { if($file != ".." && $file != ".") { //排除根目录; if(is_dir($dir."/".$file)) { //如果是子文件夹,就进行递归 $files[$file] = my_dir($dir."/".$file); } else { //不然就将文件的名字存入数组; $files[] = $file; } } } closedir($handle); return $files; }
}
/**
* @param string $dir_name 目录名
* @return mixed|string
*/
static public function dirPath($dir_name)
{
$dirname = str_ireplace("\\", "/", $dir_name);
return substr($dirname, "-1") == "/" ? $dirname : $dirname . "/";
}
/**
* 获得扩展名
* @param string $file 文件名
* @return string
*/
static public function getExt($file)
{
return strtolower(substr(strrchr($file, "."), 1));
}
/**
* 遍历目录内容
* @param string $dirName 目录名
* @param string $exts 读取的文件扩展名
* @param int $son 是否显示子目录
* @param array $list
* @return array
*/
static public function tree($dirName = null, $exts = '', $son = 0,$list = array() )
{
if (is_null($dirName)) $dirName = '.';
$dirPath = self::dirPath($dirName);
static $id = 0;
if (is_array($exts))
$exts = implode("|", $exts);
foreach (glob($dirPath . '*') as $v) {
$id++;
if (is_dir($v) || !$exts || preg_match("/\.($exts)/i", $v)) {
$list [$id] ['type'] = filetype($v);
$list [$id] ['filename'] = basename($v);
$path = str_replace("\\", "/", realpath($v)) . (is_dir($v) ? '/' : '');
$list [$id] ['path']=$path;
$list [$id] ['spath']=ltrim(str_replace(dirname($_SERVER['SCRIPT_FILENAME']),'',$path),'/');
$list [$id] ['filemtime'] = filemtime($v);
$list [$id] ['fileatime'] = fileatime($v);
$list [$id] ['size'] = is_file($v) ? filesize($v) : self::get_dir_size($v);
$list [$id] ['iswrite'] = is_writeable($v) ? 1 : 0;
$list [$id] ['isread'] = is_readable($v) ? 1 : 0;
}
if ($son) {
if (is_dir($v)) {
$list = self::tree($v, $exts, $son = 1, $list);
}
}
}
return $list;
}
/**
* 遍历目录内容【时间控制】
* @param string $dirName 目录名
* @param string $exts 读取的文件扩展名
* @param int $son 是否显示子目录
* @param array $list
* @return array
*/
static public function treeTime($dirName = null,$startDate=0 , $endDate=0, $exts = '', $son = 0,$list = array() )
{
if (is_null($dirName)) $dirName = '.';
$dirPath = self::dirPath($dirName);
static $id = 0;
if (is_array($exts))
$exts = implode("|", $exts);
foreach (glob($dirPath . '*') as $v) {
if(filemtime($v) > $startDate && filemtime($v) < $endDate){
$id++;
if (is_dir($v) || !$exts || preg_match("/\.($exts)/i", $v)) {
$list [$id] ['type'] = filetype($v);
$list [$id] ['filename'] = basename($v);
$path = str_replace("\\", "/", realpath($v)) . (is_dir($v) ? '/' : '');
$list [$id] ['path']=$path;
$list [$id] ['spath']=ltrim(str_replace(dirname($_SERVER['SCRIPT_FILENAME']),'',$path),'/');
$list [$id] ['filemtime'] = filemtime($v);
$list [$id] ['fileatime'] = fileatime($v);
$list [$id] ['size'] = is_file($v) ? filesize($v) : self::get_dir_size($v);
$list [$id] ['iswrite'] = is_writeable($v) ? 1 : 0;
$list [$id] ['isread'] = is_readable($v) ? 1 : 0;
}
if ($son) {
if (is_dir($v)) {
$list = self::tree($v, $exts, $son = 1, $list);
}
}
}
}
return $list;
}
static public function get_dir_size($f)
{
$s = 0;
foreach (glob($f . '/*') as $v) {
$s += is_file($v) ? filesize($v) : self::get_dir_size($v);
}
return $s;
}
/**
* 只显示目录树
* @param null $dirName 目录名
* @param int $son
* @param int $pid 父目录ID
* @param array $dirs 目录列表
* @return array
*/
static public function treeDir($dirName = null, $son = 0, $pid = 0, $dirs = array())
{
if (!$dirName) $dirName = '.';
static $id = 0;
$dirPath = self::dirPath($dirName);
foreach (glob($dirPath . "*") as $v) {
if (is_dir($v)) {
$id++;
$dirs [$id] = array("id" => $id, 'pid' => $pid, "dirname" => basename($v), "dirpath" => $v);
if ($son) {
$dirs = self::treeDir($v, $son, $id, $dirs);
}
}
}
return $dirs;
}
/**
* 删除目录及文件,支持多层删除目录
* @param string $dirName 目录名
* @return bool
*/
static public function del($dirName)
{
if (is_file($dirName)) {
unlink($dirName);
return true;
}
$dirPath = self::dirPath($dirName);
if (!is_dir($dirPath)) return true;
foreach (glob($dirPath . "*") as $v) {
is_dir($v) ? self::del($v) : unlink($v);
}
return @rmdir($dirName);
}
/**
* 批量创建目录
* @param $dirName 目录名数组
* @param int $auth 权限
* @return bool
*/
static public function create($dirName, $auth = 0755)
{
$dirPath = self::dirPath($dirName);
if (is_dir($dirPath))
return true;
$dirs = explode('/', $dirPath);
$dir = '';
foreach ($dirs as $v) {
$dir .= $v . '/';
if (is_dir($dir))
continue;
mkdir($dir, $auth);
}
return is_dir($dirPath);
}
/**
* 复制目录
* @param string $olddir 原目录
* @param string $newdir 目标目录
* @param bool $strip_space 去空白去注释
* @return bool
*/
static public function copy($olddir, $newdir, $strip_space = false)
{
$olddir = self::dirPath($olddir);
$newdir = self::dirPath($newdir);
if (!is_dir($olddir))
error("复制失败:" . $olddir . "目录不存在");
if (!is_dir($newdir))
self::create($newdir);
foreach (glob($olddir . '*') as $v) {
$to = $newdir . basename($v);
if (is_file($to))
continue;
if (is_dir($v)) {
self::copy($v, $to, $strip_space);
} else {
if ($strip_space) {
$data = file_get_contents($v);
file_put_contents($to, strip_space($data));
} else {
copy($v, $to);
}
chmod($to, "0777");
}
}
return true;
}
/**
* 目录下创建安全文件
* @param $dirName 操作目录
* @param bool $recursive 为true会递归的对子目录也创建安全文件
*/
static public function safeFile($dirName, $recursive = false)
{
$file = HDPHP_TPL_PATH . '/index.html';
if (!is_dir($dirName)) {
return;
}
$dirPath = self::dirPath($dirName);
/**
* 创建安全文件
*/
if (!is_file($dirPath . 'index.html')) {
copy($file, $dirPath . 'index.html');
}
/**
* 操作子目录
*/
if ($recursive) {
foreach (glob($dirPath . "*") as $d) {
is_dir($d) and self::safeFile($d);
}
}
}
/**
* 建立请求,以表单HTML形式构造(默认)
* @param $para_temp 请求参数数组
* @param $method 提交方式。两个值可选:post、get
* @param $button_name 确认按钮显示文字
* @return 提交表单HTML文本
*/
function buildRequestForm($para_temp, $method, $button_name) {
//待请求参数数组
$para = $this->buildRequestPara($para_temp);
$sHtml = "<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>";
$sHtml = "<form id='alipaysubmit' name='alipaysubmit' action='".$this->alipay_gateway_new."_input_charset=".trim(strtolower($this->alipay_config['input_charset']))."' method='".$method."'>";
while (list ($key, $val) = each ($para)) {
$sHtml.= "<input type='hidden' name='".$key."' value='".$val."'/>";
}
//submit按钮控件请不要含有name属性
$sHtml = $sHtml."<input type='submit' value='".$button_name."' style='display:none;'></form>";
$sHtml = $sHtml."<script>document.forms['alipaysubmit'].submit();</script>";
return $sHtml;
}
//加密
function encryption($parameter){$key=get_key();
$info= base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128 ,$key,$parameter , MCRYPT_MODE_ECB, $key));
return $info;
}
//解密
function decryption($parameter){$key=get__key();
$info= mcrypt_decrypt(MCRYPT_RIJNDAEL_128 ,$key,base64_decode($parameter) , MCRYPT_MODE_ECB, $key);
$info= str_replace("\0","",$info);
return $info;
}
//随机返回二维数组中的值
function rand_ip($ip,$num){//数组中个数
$temp = array_rand($ip,$num);
$arr=[];
$count=count($ip);
//随机返回个数
for($i=0;$i<$count;$i++){
$arr[]=$ip[$temp[$i]];
}
$arr1=[];
foreach($arr as $v){
if(empty($v)){
unset($v);
}else{
$arr1[]=$v;
}
}
return $arr1;
}
/*
导出CSV
*/
function export_csv($data){
$string="";
foreach ($data as $key => $value)
{
foreach ($value as $k => $val)
{
$value[$k]=iconv('utf-8','gb2312',$value[$k]);
}
$string .= implode(",",$value)."\n"; //用英文逗号分开
}
$filename = date('Ymd').'.csv'; //设置文件名
header("Content-type:text/csv");
header("Content-Disposition:attachment;filename=".$filename);
header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
header('Expires:0');
header('Pragma:public');
echo $string;
}
/**
* 判断是否重复添加
* @param string $key 字段名
* @param string $value 字段值
* @param string $table 表名
* @param string $id_key id编号
* @param int $id_value id值
*/
function isRepeat($key,$value,$table,$id_key='',$id_value=0){
$where = $key .'="'.$value.'"';
if($id_key <> ''){
$where.=" and ".$id_key." <> ".$id_value;
}
$rs_count = Db::name($table)->where($where)->count();
return $rs_count;
}