PHP常用函数整理

工作中常用的PHP函数,整理出来,以方便后边快速使用轮子。

1、字符串编码转换

/**
 * 字符串编码转换
 * 
 * @param  string  $str          待处理的字符
 * @param  string  $in_charset   输入编码
 * @param  string  $out_charset  输出编码
 * @return string
 */
function str_iconv($str, $in_charset = 'UTF-8', $out_charset = 'GBK')
{
  $str = mb_convert_encoding($str, $out_charset, $in_charset);
  return $str;
}

2、数组编码转换

/**
 * 数组编码转换
 * 
 * @param  array   $arr          待处理的数组
 * @param  string  $in_charset   输入编码
 * @param  string  $out_charset  输出编码
 * @return array
 */
function arr_iconv($arr, $in_charset = 'UTF-8', $out_charset = 'GBK')
{
  $arr = eval('return ' . mb_convert_encoding(var_export($arr,true), $out_charset, $in_charset) . ';');
  return $arr;
}

3、从内容中匹配出图片信息

/**
 * 从内容中匹配出图片信息(有多少图片信息就匹配出多少)
 *
 * @param  string   $content         内容信息
 * @param  boolean  $b_only_img_url  是否只获取图片地址,默认为true
 * @return array
 *   
  • 当$b_only_img_url = true时,只返回图片地址的一维数组
  •  *   
  • 当$b_only_img_url = false时,返回图片地址的多种信息,二维数组,如下:
  •  *   
  • img_tag  =>  ''
  •  *   
  • img_src  =>  'src="http://www.baidu.com/img/bdlogo.gif"'
  •  *   
  • img_url  =>  'http://www.baidu.com/img/bdlogo.gif'
  •  */ function get_img_list_from_content($content, $b_only_img_url = true) {   preg_match_all('/]*?(?Psrc\s*=\s*([\'"]|"|'|')(?P.*?)([\'"]|"|'|'))[^>]*?>/msi', $content, $match);   $arr_temp = array();   if($match['img_url_arr'])   {     foreach($match['img_url_arr'] as $key => $img_url)     {       if($b_only_img_url)       {         $img_info = $img_url;       }       else       {         $img_info = array(           'img_tag' => $match[0][$key],           'img_src' => $match['img_src_arr'][$key],           'img_url' => $match['img_url_arr'][$key],         );       }       $arr_temp[] = $img_info;     }   }   return $arr_temp; }

    4、获取一个Hash编码

    /**
     * 获取一个Hash编码
     *
     * @param string $str 字符串
     * @return string
     */
    function make_hash_code($str)
    {
        if(empty($str)) return '';
        $mdv = md5($str);
        $mdv1 = substr($mdv,0,16);
        $mdv2 = substr($mdv,16,16);
        $crc1 = abs(crc32($mdv1));
        $crc2 = abs(crc32($mdv2));
        return bcmul($crc1,$crc2);
    }

    5、根据某天返回特定日期

    /**
     * 根据当天的时间,返回此周末的时间
     *
     * @param string $date
     * @return array $date_arr($Sat,$Sun)
     */
    function get_weekend_by_date()
    {
        $year = date("Y");
        $month = date("m");
        $day = date("d");
        $nowday = mktime(0,0,0,$month,$day,$year);
        $w=(int)date("w",$nowday);
        if($w==0)
        {
            $Sat = mktime(0,0,0,$month,$day - 1,$year);
            $Sun = mktime(0,0,0,$month,$day + 1,$year);
        }else{
            $t = 6 - $w;
            $Sat = mktime(0,0,0,$month,$day + $t,$year);
            $Sun = mktime(0,0,0,$month,$day + $t + 2,$year);
        }
        return array("Sat"=>$Sat,"Sun"=>$Sun);
    }
    
    /**
     * 根据时间英文名称,返回特定时间段戳
     * @desc 返回今天,周末,下周,未来,过去,某个时间段对应的时间戳
     * @param  string   $time_type  时间形式(today, weekend, next_week,future_all,history, time_to_time)
     * @param $search_end_time  当time_type为time_to_time时,需要传入时间戳
     * @return array;
     */
    function get_timestamp_by_time_type($time_type = "today", $search_end_time = "")
    {
        // 支持的日期格式名称
        // $time_type_arr = array('today', 'weekend', 'next_week', 'future_arr', 'history', 'time_to_time');
    
        switch ($time_type)
        {
            case "today": //今天
    
                $today    = strtotime(date('Y-m-d'));
                $tomorrow = $today+86400;
                $querys["start_time"] = $tomorrow;
                $querys["end_time"] = $today;
                break;
    
            case "weekend": //周末
                $arr = mforum_get_weekend_by_date();
                $querys["start_time"] = $arr["Sun"];
                $querys["end_time"] = $arr["Sat"];
                break;
    
            case "next_week": //未来7天
                $today     = strtotime(date('Y-m-d'));
                $next_week = $today+(86400*7);
                $tomorrow  = $today+86400;
                $querys["start_time"] = $next_week;
                $querys["end_time"] = $tomorrow;
                break;
    
            case "future_all": //未来全部
                $nowtime=time();
                $querys["end_time"] = $nowtime;
                break;
    
            case "history": //历史活动
                $nowtime=time();
                $querys["end_time"] = "< {$nowtime}";
                break;
    
            case "time_to_time": //选择时间段
                $end_time = strtotime($search_end_time);
                if(!empty($end_time))
                {
                    $day     = strtotime(date('Y-m-d',$end_time));
                    $tomorrow = $day+86400;
                    $querys["start_time"] = $tomorrow;
                    $querys["end_time"] = $day;
                }
                break;
            default:
                break;
        }
    
        return $querys;
    }
    

    6、从内容中取出简介

    /**
     * 从内容中取出简介
     * 
     * @param  string   $content  传入的内容
     * @param  int      $length   截取长度
     * @param  boolean  $b_pure   是否过滤所有标签,还是只保留


    * @return string */ function make_content_summary($content, $length = 200, $b_pure = false, $b_filter_word = true) { if(empty($content)) return ''; $content = str_replace(array(' ', ''', '"'), array(' ', "'", '"'), $content); $b_pure == true && $content = strip_tags($content, '


    '); $b_pure == false && $content = strip_tags($content); $mixed_arr = array( '/[\r\n]*?/' => '', //并为一行 '/.*<\/span>/iU' => '', '/(rel="item"\/>)

    [^<]*?

    /iU' => '$1', '/&[a-z]+;/' => '', '/<([a-z]+)[^>]*?>/i' => '<\1>', '/(<\/?br\s*?\\/?\s*?>){2,}/i' => '\1', '/(
    \s*){2,}/' => '
    ', '/<[^>]*?$/ms' => '', '/\s+/' => '', ); $pattern = array_keys($mixed_arr); $replacement = array_values($mixed_arr); $content = preg_replace($pattern, $replacement, $content); $content = mb_substr($content, 0, $length, 'GBK'); $content = trim($content); $content = preg_replace('~<[\w]+$~', '', $content); if(trim(strip_tags($content)) == '') $content = ''; //空标签返回空 return $content; }

    7、根据过期时间判断剩余的天数

    /**
     * 根据过期时间判断剩余的天数
     * @desc   如果为0,则表示活动已经结束
     * @param  $expire_time 时间戳
     * @return float|int
     */
    function check_remaining_days($expire_time)
    {
        // 获取当前时间
        $cur_time = time();
        $expire_time = (int)$expire_time;
    
        $diff_time = ($expire_time - $cur_time);
        $remaining_days_count = 0;
        if($diff_time > 0)
        {
            // 计算剩余的天数
            $remaining_days_count = ceil($diff_time / (24 * 3600));
        }
    
        return $remaining_days_count;
    }
    

    8、切割字符串

    /**
     * 切割字符串
     * 
     * @param  string  $str     需要切割的字符串
     * @param  int     $lenght  长度
     * @param  string  $tail    超过长度后面追加字符
     * @param  string  $encrypt 编码,默认GBK
     * @return string
     */
    function cut_str($str, $lenght, $tail='...', $encrypt='GBK')
    {
      if(mb_strlen($str,$encrypt) > $lenght)
      {
        return mb_substr($str, 0, $lenght, 'GBK').$tail;
      }
      else
      {
        return $str;
      }
    
    }

    9、php页面返回前端页面js信息

    
    /**
     * 错误信息提示,并退出程序
     * @param string $msg 错误信息
     */
    if (!function_exists("js_pop_msg_parent"))
    {
        function js_pop_msg_parent($msg,$b_reload=false,$url=NULL)
        {
            echo "";
            exit;
        }
    }
    
    // 举例:
    index.php
     0 ? "操作成功" : "操作失败!";
    $b_reload = $user_id > 0 ? true : false;
    
    // 返回信息
    js_pop_msg_parent($msg,$b_reload);

    10、php页面header跳转

    //1.立即跳转
    header("location:http://baidu.com/");
    exit();
    
    // 2.几秒后再跳转
     header("refresh:3;url=http://baidu.com/");
     print('请求的内容不存在...
    三秒后自动跳转。'); exit();

    11、数组与字符串相互转换

    // 将数组转为字符串
         function a2s($arr)
        {
            $str = "";
            foreach ($arr as $key => $value)
            {
                if (is_array($value))
                {
                    foreach ($value as $value2)
                    {
                        $str .= urlencode($key) . "[]=" . urlencode($value2) . "&";
                    }
                }
                else
                {
                    $str .= urlencode($key) . "=" . urlencode($value) . "&";
                }
            }
            return $str;
        }
    
    
    // 将字符串转为数组
    function s2a($str)
        {
            $arr = array();
            parse_str($str, $arr);
            return $arr;
        }
    
    
    // 完整示例
    $arr = array('usr_id' => 2, 'nickname' => '周荣发',   "uids" => array(6,234,34,67,7888,2355));
    $ret = a2s($arr);
    dump($ret );
    
    
    $str = "usr_id=2&nickname=%D6%DC%C8%D9%B7%A2&uids[]=6&uids[]=234&uids[]=34&uids[]=67&uids[]=7888&uids[]=2355&";
    $new_arr = s2a($str);
    dump($new_arr);
    
    

    12、生成指定长度随机数

    function generate_code($length = 6)
     {
        return rand(pow(10,($length-1)), pow(10,$length)-1);
    }

    13、判断手机号是否正确

     /**
       * 判断手机号码是否正确
       * @param $phone    手机号
       * @param $zone_num 区号
       */
      function  check_phone($phone, $zone_num = 86)
      {
        if(!is_numeric($phone) || !is_numeric($zone_num)) return false;
    
        if($zone_num === 86)
        {
          // 国内号码规则
          return preg_match('/^13[\d]{9}$|^14[5,7]{1}\d{8}$|^15[^4]{1}\d{8}$|^17[0,6,7,8]{1}\d{8}$|^18[\d]{9}$/', $phone) ? true : false;
        }
        else
        {
          // 国际号码,这里只做一个简单的匹配
          return preg_match('/^[1-9]{1}\d{7,15}$/', $phone) ? true : false;
        }
    
      }

    13、获取对象的公共属性

    publics($User);
    
    $ret = get_object_vars($User);
    print_r($data);
    

    14、页面跳转

    if(!function_exists('redirect'))
    {
        // 网页跳转
        function redirect($url)
        {
            header("Location:{$url}");
            exit();
        }
    }
    
    /**
     * 页面信息跳转
     *
     * @param  string  $url  跳转地址
     * @param  string  $msg  消息内容
     * @return void
     */
    function page_msg_location($url, $alert = null, $b_parent = false)
    {
        // 如果提示信息出现乱码,需要加上编码信息
       echo '';
      echo '';
        echo '';
        exit();
    }
    

    15、获取某月的第一天和最后一天

    // php获取当月天数及当月第一天及最后一天、上月第一天及最后一天实现方法
    1.获取上个月第一天及最后一天.
       echo date('Y-m-01', strtotime('-1 month'));
       echo "
    "; echo date('Y-m-t', strtotime('-1 month')); echo "
    "; 2.获取当月第一天及最后一天. $BeginDate=date('Y-m-01', strtotime(date("Y-m-d"))); echo $BeginDate; echo "
    "; echo date('Y-m-d', strtotime("$BeginDate +1 month -1 day")); echo "
    "; 3.获取当天年份、月份、日及天数. echo " 本月共有:".date("t")."天"; echo " 当前年份".date('Y'); echo " 当前月份".date('m'); echo " 当前几号".date('d'); echo "
    "; 4.使用函数及数组来获取当月第一天及最后一天,比较实用 function getthemonth($date) { $firstday = date('Y-m-01', strtotime($date)); $lastday = date('Y-m-d', strtotime("$firstday +1 month -1 day")); return array($firstday,$lastday); } $today = date("Y-m-d"); $day=getthemonth($today); echo "当月的第一天: ".$day[0]." 当月的最后一天: ".$day[1]; echo "
    "; 5.封装了一个方法,开箱即用: $year = 2017; $month = 2; function get_month_first_and_last_day($year, $month) { if(empty($year) || empty($month)) { return array(); } $date = $year . "-" . $month; $begin_date = date('Y-m-01 00:00:00', strtotime($date)); $last_date = date('Y-m-d 23:59:59', strtotime("$begin_date +1 month -1 day")); return array('begin_date' => $begin_date, 'last_date' => $last_date); } $ret = get_month_first_and_last_day($year, $month); print_r($ret); Array ( [begin_date] => 2017-02-01 00:00:00 [last_date] => 2017-02-28 23:59:59 )

    16、根据二维数组的数据字段名返回其对应的值数组

    /**
     * 根据二维数组的数据字段名返回其对应的值数组
     * 
     * @param  array    $rows         二维数组
     * @param  string   $field_name   字段名
     * @param  boolean  $b_off_empty  是否排除空值,默认:true
     * @return array
     */
    function array_values_by_field_name($rows, $field_name, $b_off_empty = false)
    {
      $ret = array();
      foreach($rows as $row)
      {
        if(isset($row[$field_name]))
        {
          if($b_off_empty)
          {
            if(!empty($row[$field_name]))
            {
              $ret[] = $row[$field_name];
            }
          }
          else
          {
            $ret[] = $row[$field_name];
          }
        }
      }
      return $ret;
    }

    17、页面打印调试

    if(!function_exists('dump'))
    {
        /**
         * 打印数据
         * @param mixed $data (可以是字符串,数组,对象)
         * @param  boolean $is_exit 是否退出程序,默认否
         */
        function dump($data, $is_exit = false)
        {
            echo "
    ";
            print_r($data);
            echo "
    "; if($is_exit) exit(); } } /** * Debug打印 * * @param string $title 显示的标题 * @param mixed $data 打印的数据 * @param boolean $b_new_line 是否空一行,默认:true * @return void */ function debug_dump($title, $data, $b_new_line = true) { if(!empty($_GET['dump'])) { if(!empty($title)) dump($title); if(!empty($data)) dump($data); if($b_new_line) dump(); } }

    18、ASCII字符转换

    $charCode = "A";   
    
    // ord 返回 "A" 的 ASCII值:
    $charCodeord = ord($charCode) + 1 ;   // ord($charCode) = 65
    $charCodeord = $charCodeord > 90 ? 0 : $charCodeord;   
    $charCode = chr($charCodeord);   // 66 => B
    
    echo $charCode; // 输出 B

    19、生成唯一订单号

    function get_order_sn()
    {
        $map = array(
            '0' => array('n' => 16),
            '1' => array('n' => 17),
            '2' => array('n' => 18),
            '3' => array('n' => 19),
            '4' => array('n' => 20),
            '5' => array('n' => 21),
            '6' => array('n' => 22),
            '7' => array('n' => 23),
            '8' => array('n' => 24),
            '9' => array('n' => 25)
        );
    
        $ymd = date('ymd', time());
    
        // 不允许超过20位
        while(1)
        {
            $rnd = rand(1, 99999999);
            $sn = $ymd.substr('00000000'.$rnd, -8);
            $sn_arr = str_split($sn);
            $v_code = 103;
            foreach($sn_arr as $v)
            {
                $v_code += $v * $map[$v]['n'];
            }
    
            $v_code = $v_code % 103;
            $djbh = $sn . $v_code;
            if(strlen($djbh) <= 20)
            {
                break;
            }
        }
    
        return $djbh;
    }
    
    // 调用
    $new_order_sn = get_order_sn();  // 1801098694194299
    

    20、json_encode 中文不转义 php5.3及以下解决办法

    function json_encode($array)
    {
    if(version_compare(PHP_VERSION,'5.4.0','<')){
    $str = json_encode($array);
    $str = preg_replace_callback("#\\\u([0-9a-f]{4})#i",function($matchs){
    return iconv('UCS-2BE', 'UTF-8', pack('H4', $matchs[1]));
    },$str);
    return $str;
    }else{
    return json_encode($array, JSON_UNESCAPED_UNICODE);
    }
    }
    
    // 测试
    $data = array('name' => '刘德华', 'age' => 25, 'song_name' => 'Always love you ');
    
    $ret = json_encode($data);
    

    你可能感兴趣的:(json,php)