1. 程式人生 > >自寫php常用公共函式(非系統函式),關鍵的時候用得著[thinkPHP5框架]

自寫php常用公共函式(非系統函式),關鍵的時候用得著[thinkPHP5框架]

 本文基於thinkPHP5框架,但不限於它,需要的時候把需要的地方改成你需要的就可以用了:

例如:你的框架是CI,那麼查詢資料就不是用Db了,稍微修改即可

<?php

use service\DataService;
use service\NodeService;
use think\Db;


/**
 * 日期格式標準輸出
 * @param string $datetime 輸入日期
 * @param string $format 輸出格式
 * @return false|string
 */
function format_datetime($datetime, $format = 'Y年m月d日 H:i:s')
{
    return date($format, strtotime($datetime));
}

/**
 * UTF8字串加密
 * @param string $string
 * @return string
 */
function encode($string)
{
    list($chars, $length) = ['', strlen($string = iconv('utf-8', 'gbk', $string))];
    for ($i = 0; $i < $length; $i++) {
        $chars .= str_pad(base_convert(ord($string[$i]), 10, 36), 2, 0, 0);
    }
    return $chars;
}

/**
 * UTF8字串解密
 * @param string $string
 * @return string
 */
function decode($string)
{
    $chars = '';
    foreach (str_split($string, 2) as $char) {
        $chars .= chr(intval(base_convert($char, 36, 10)));
    }
    return iconv('gbk', 'utf-8', $chars);
}

/**
 * description:獲取某張表的欄位
 * author:wanghua
 * @param $tablename
 * @return array
 */
function getTableFieldsByName($tablename){
    if(!$tablename)return [];
    $prefix = config('database.prefix');
    if($prefix && false !== strpos($tablename, $prefix))
        $tablename = $prefix.$tablename;

    return Db::table($tablename)->getTableFields();
}

/**
 * description:換行輸出(一般用於除錯 eg:在迴圈中輸出)
 * author:wanghua
 */
function brEcho($msg){
    echo '<br/>';
    echo $msg;
    echo '<br/>';
}

/**
 * description:常用表單型別 1 input 2 select 3 radio 4 textarea 5 textarea_editer 6 img
 * author:wanghua
 * @param string $type
 * @param bool|false $all
 * @return array|string
 */
function getFormType($type='', $all=false){
    $arr = ['','input','date','select','radio','textarea','textarea_editer', 'img'];
    if($type){
        if(is_numeric($type)){
            return isset($arr[$type])?$arr[$type]:$type;
        }else{
            return $type;
        }
    }
    if($all){
        return $arr;
    }
    return '';
}

/**
 * description:根據下標獲取欄位型別(常用且可配置)
 * author:wh
 */
function getFieldsType($type='', $all=false){
    $arr = ['','int','float','varchar','text','longtext'];

    if($type){
        return empty($arr[$type])?$type:$arr[$type];
    }
    if($all){
        return $arr;
    }
    return $type;
}

/**
 * description:網站選單列表(這裡只是例子)
 * author:wh
 * @param $type 下標值
 * @param string $all 返回所有
 * @return array
 */
function getMenuType($type, $all=''){
    $arr = [
        1=>'首頁',
        2=>'關於我們',
        3=>'課程設定',
        4=>'招生資訊',
        5=>'師資隊伍',
        6=>'優秀學生',
        7=>'新聞資訊',
        8=>'聯絡我們'
    ];
    if($type){
        return empty($arr[$type])?$type:$arr[$type];
    }
    if($all){
        return $arr;
    }
    return $type;
}

/**
 * description:讀取base64編碼後的圖片並儲存到path(實測可用)
 * author:wh
 * @param $base64_image_content
 * @param $path
 * @return bool|string
 */
function base64_image_content($base64_image_content,$path){
    //匹配出圖片的格式
    if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)){
        $type = $result[2];
        $new_file = $path."/".date('Ymd',time())."/";
        if(!file_exists($new_file)){
            //檢查是否有該資料夾,如果沒有就建立,並給予最高許可權
            mkdir($new_file, 0777);
        }
        $new_file = $new_file.time().".{$type}";
        if (file_put_contents($new_file, base64_decode(str_replace($result[1], '', $base64_image_content)))){
            return '/'.$new_file;
        }else{
            return false;
        }
    }else{
        return false;
    }
}

/**
 * 驗證手機號是否正確(常規)
 * @author wanghua
 */
function is_mobile($mobile) {
    if (!is_numeric($mobile)) {
        return false;
    }
    return preg_match('#^13[\d]{9}$|^14[5,7]{1}\d{8}$|^15[^4]{1}\d{8}$|^17[0,6,3,7,8]{1}\d{8}$|^18[\d]{9}$#', $mobile) ? true : false;
}

/**
 * description:查詢當前資料庫所有的表名
 * author:wh
 * @return mixed 返回表名一維陣列
 */
function getTables(){
    return array_column(Db::query('SHOW TABLES;'), 'Tables_in_'.config('database.database'));
}

/**
 * description:獲取專案根路徑
 * author:wanghua
 */
if (!function_exists('get_root_path')) {
    function get_root_path(){
        $str = str_replace('\\', '/', APP_PATH);
        return $str.'..';
    }
}
/**
 * 驗證郵箱格式(常規)
 */
function is_email($email){
   return preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)?true:false;
}

/**
 * description:刪除目錄下的檔案:許可權不足可能導致失敗
 * author:wanghua
 * @param $backpath
 * @return bool
 */
function deleteFile($path=''){
    if(!$path|| !file_exists($path))return false;
    $files = scandir($path);
    if($files){
        foreach ($files as $key => $val){
            if(!in_array($val, ['.', '..'])){
                unlink($path.$val);
            }
        }
        return true;
    }else{
        return false;
    }
}

if(!function_exists('log_to_write_txt')){
    /**
     * 記錄日誌文字到.txt檔案-日誌檔案可即時刪除
     * wanghua
     * @param string $data
     * @param string $filepath 預設儲存路徑
     */
    function log_to_write_txt($data = 'test', $filepath = '/runtime/log.txt'){
        //IP白名單-正式運營後可開啟
        //$white_ips = [
        //    '183.67.48.137'
        //];
        //if(in_array(get_client_ip(), $white_ips)){
        $filepath = get_root_path().$filepath;
        $str = '';
        file_put_contents($filepath, is_object($data)||is_array($data)?$str.json_encode($data)."\n":$str.$data."\n", FILE_APPEND);
        //}else{
        //    file_put_contents($filepath, 'white_ips have not check success '."\n", FILE_APPEND);
        //}
    }
}
/**
 * description:二維物件陣列轉換為二維陣列
 * author:wanghua
 */

if (!function_exists('objToArray')) {
    function objToArray($peoples){
        $tmp = [];
        foreach ($peoples as $k=>$v){
            $tmp[$k] = is_object($v)?$v->toArray():$v;
        }
        return $tmp;
    }
}

//將XML字串轉為array
if (!function_exists('xmlStrToArray')) {
    function xmlStrToArray($xml){
        //禁止引用外部xml實體
        libxml_disable_entity_loader(true);
        $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
        return $values;
    }
}

/**
 * description:產生一個訂單號
 * 說明:userid一般是定長
 * author:wanghua
 */
if (!function_exists('createOrderNo')) {
    function createOrderNo(){
        return time().session('user.userid').rand(10000,99999);
    }
}

/**
 * 輸出xml字元
 * @throws WxPayException
 **/
if (!function_exists('toXml')) {
    function toXml($data){
        if(!is_array($data) || count($data) <= 0){
            throw new WxPayException("陣列資料異常!");
        }

        $xml = "<xml>";
        foreach ($data as $key=>$val){
            if (is_numeric($val)){
                $xml.="<".$key.">".$val."</".$key.">";
            }else{
                $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
            }
        }
        $xml.="</xml>";
        return $xml;
    }
}
/**
 * description:返回xml 物件
 * author:wanghua
 * @param bool $res
 * @return string
 */
if (!function_exists('xmlResReturn')) {
    function xmlResReturn($res = true){
        $tmp_suc = $res?'SUCCESS':'FAIL';
        $tmp_ok = $res?'OK':'ERR';
        $xml = "<xml>
                      <return_code><![CDATA[{$tmp_suc}]]></return_code>
                      <return_msg><![CDATA[{$tmp_ok}]]></return_msg>
                    </xml>";

        return simplexml_load_string($xml);
    }
}

/**
 * XML編碼
 * @param mixed $data 資料
 * @param string $encoding 資料編碼
 * @param string $root 根節點名
 * @return string
 */
if (!function_exists('xml_encode')) {
    function xml_encode($data, $encoding='utf-8', $root='xml') {
        $xml    = '<?xml version="1.0" encoding="' . $encoding . '"?>';
        $xml   .= '<' . $root . '>';
        $xml   .= data_to_xml($data);
        $xml   .= '</' . $root . '>';
        return $xml;
    }
}

/**
 * 資料XML編碼
 * @param mixed $data 資料
 * @return string
 */
if (!function_exists('data_to_xml')) {
    function data_to_xml($data) {
        $xml = '';
        foreach ($data as $key => $val) {
            is_numeric($key) && $key = "item id=\"$key\"";
            $xml    .=  "<$key>";
            $xml    .=  ( is_array($val) || is_object($val)) ? data_to_xml($val) : $val;
            list($key, ) = explode(' ', $key);
            $xml    .=  "</$key>";
        }
        return $xml;
    }
}

/**
 * description:設定結果(常用於非同步請求返回格式)
 * author:wanghua
 * @param int $code
 * @param string $msg
 * @param array $data
 * @param bool $is_return_json 是否返回json
 * @return array|string
 */
if (!function_exists('set_res')) {
    function set_res($code = 0, $msg = '', $data = [], $is_return_json = false){
        $r = ['code' => $code, 'msg' => $msg, 'data'=>$data];
        return $is_return_json?json_encode($r):$r;
    }
}

/**
 * description:curl請求(整理於微信)
 * author:wanghua
 * @param $url
 * @return mixed
 */
if (!function_exists('req_url')) {
    function req_url($url){
        //初始化curl
        $ch = curl_init();
        //設定超時
        curl_setopt($ch, CURLOPT_TIMEOUT, 180);//$this->curl_timeout
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,FALSE);
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        //使用代理抓取內容
        //if(\Config::CURL_PROXY_HOST != "0.0.0.0"
        //    && \Config::CURL_PROXY_PORT != 0){
        //    curl_setopt($ch,CURLOPT_PROXY, '0.0.0.0');
        //    curl_setopt($ch,CURLOPT_PROXYPORT, 0);
        //}
        //執行curl,結果以jason形式返回
        $res = curl_exec($ch);
        curl_close($ch);
        //取出openid
        return json_decode($res,true);
    }
}

if (!function_exists('rand_str')) {
    /**
     * 生成隨機字串
     * @param int $length 生成長度
     * @param int $type 生成型別:0-小寫字母+數字,1-小寫字母,2-大寫字母,
     * 3-數字,4-小寫+大寫字母,5-小寫+大寫+數字
     * @return string
     */
    function rand_str($length = 8, $type = 0) {
        $a = 'abcdefghijklmnopqrstuvwxyz';
        $A = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $n = '0123456789';

        switch ($type) {
            case 1: $chars = $a; break;
            case 2: $chars = $A; break;
            case 3: $chars = $n; break;
            case 4: $chars = $a.$A; break;
            case 5: $chars = $a.$A.$n; break;
            default: $chars = $a.$n;
        }

        $str = '';
        for ($i = 0; $i < $length; $i++) {
            $str .= $chars[ mt_rand(0, strlen($chars) - 1) ];
        }
        return $str;
    }
}

if(!function_exists('arrArrToSort')){
    /**
     * description:php二維陣列排序(升、降)
     * author:wanghua
     * @param $data 資料來源(必須是二維陣列)
     * @param $field 要排序的欄位(必須) eg:年齡或者價格
     * @param bool $sort 排序方式
     * @param bool $unique_field 指定唯一欄位 eg:例如userID一般都是唯一的
     * @return array 返回排序後的資料來源
     */
    function arrArrToSort($data, $field, $sort=true, $unique_field){
        //取出排序源
        $field_arr_key = array_column($data, $unique_field);
        $field_arr_val = array_column($data, $field);

        $source_arr = [];
        foreach ($field_arr_key as $key=>$val){
            $source_arr[$val] = $field_arr_val[$key];
        }

        //排序
        if($sort)arsort($source_arr);
        else asort($source_arr) ;
        //重組資料
        $new_arr = [];
        foreach ($source_arr as $k=>$v){
            foreach ($data as $a=>$b){
                if($k == $b[$unique_field]){
                    array_push($new_arr, $b);
                }
            }
        }
        return $new_arr;
    }
}

if(!function_exists('returnDateString')){
    /**
     * description:日期換算為 今天 昨天 2天前 一週前 一個月前 一年前
     * author:wanghua
     * @param $date 時間戳
     */
    function returnDateString($date){
        $date = $date*1;
        $arr = [
            0=>'今天',
            1=>'昨天',
            2=>'前天',
            7=>'一週前',
            30=>'一個月前',
            365=>'一年前',
            -1=>'很久以前',
        ];
        //今天
        $today = strtotime(date('Y-m-d'));
        if(($date-$today)>=0){
            return $arr[0];
        }else if(($date-$today)<0 && ($today-$date)<=86400){
            return $arr[1];
        }else if(($date-$today)<0 && ($today-$date)<=86400*2){
            return $arr[2];
        }else if(($date-$today)<0 && ($today-$date)<=86400*7){
            return $arr[7];
        }else if(($date-$today)<0 && ($today-$date)<=86400*30){
            return $arr[30];
        }else if(($date-$today)<0 && ($today-$date)<=86400*365){
            return $arr[365];
        }
        return $arr[-1];
    }
}


if(!function_exists('keyValByArrArr')){
    /**
     * description:返回由二維陣列的其中兩個欄位(鍵)組成的一維陣列
     * author:wanghua
     */
    function keyValByArrArr($data, $key, $key2){
        $data = objToArray($data);
        $arr = array_column($data, $key);
        $arr2 = array_column($data, $key2);
        $tmp = [];
        foreach ($arr as $k=>$v){
            $tmp[$v]=$arr2[$k];
        }
        return $tmp;
    }
}

if(!function_exists('returnArrSomeOne')){
    /**
     * description:查詢二維陣列中某一條資料
     * author:wanghua
     */
    function returnArrSomeOne($data, $field, $val){
        foreach ($data as $k=>$v){
            if($v[$field] == $val){
                return $v;
            }
        }
        return false;
    }
}

if(!function_exists('getTabFieldByCon')){
    /**
     * description:查詢資料,返回這個欄位的列
     * author:wanghua
     * @param $table
     * @param $field
     */
    function getTabFieldByCon($table, $field, $condition=[]){
        if($condition)
        {
            $d = Db::table($table)->field($field)->where($condition)->find();
            return $d[$field];
        }
        else
        {
            $d = Db::table($table)->field($field)->select();
            return array_column($d, $field);
        }
    }
}

if(!function_exists('replace_unicode_escape_sequence')){
    /**
     * description:
    呼叫
    $name = '\u65b0\u6d6a\u5fae\u535a';
    $data = unicodeDecode($name); //輸出新浪微博
     * author:wanghua
     * @param $match
     * @return string
     */
    function replace_unicode_escape_sequence($match) {
        return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE');
    }
}


if(!function_exists('unicodeDecode')){

    /**
     * description:中文被unicode編碼後了的資料,解碼出中文 Unicode解碼
     * author:wanghua
     * @param $data
     * @return null|string|string[]
     */
    function unicodeDecode($data){

        $rs = preg_replace_callback('/\\\\u([0-9a-f]{4})/i', 'replace_unicode_escape_sequence', $data);

        return $rs;
    }
}


if(!function_exists('unicodeEncode')){
/**
 * description:unicode編碼
 * author:wanghua
 * @param $str
 * @return string
 */
    function unicodeEncode($str){
        //split word
        preg_match_all('/./u',$str,$matches);

        $unicodeStr = "";
        foreach($matches[0] as $m){
            //拼接
            $unicodeStr .= "&#".base_convert(bin2hex(iconv('UTF-8',"UCS-4",$m)),16,10);
        }
        return $unicodeStr;
    }
}