1. 程式人生 > 實用技巧 >常用函式PHP

常用函式PHP

//驗證是否為指定長度的字母/數字組合

function fun_text1($num1,$num2,$str)

{

     return (preg_match("/^[a-zA-Z0-9]{".$num1.",".$num2."}$/",$str))?true:false;

}



//驗證是否為指定長度數字

function fun_text2($num1,$num2,$str)

{

     return (preg_match("/^[0-9]{".$num1.",".$num2."}$/i",$str))?true:false;

}



//驗證是否為指定長度漢字

function fun_font($num1,$num2,$str)

{

// preg_match("/^[\xa0-\xff]{1,4}$/", $string);

    return (preg_match("/^([\x81-\xfe][\x40-\xfe]){".$num1.",".$num2."}$/",$str))?true:false;

}



//驗證身份證號碼

function fun_status($str)

{

     return (preg_match('/(^([\d]{15}|[\d]{18}|[\d]{17}x)$)/',$str))?true:false;

}



//驗證郵件地址

function fun_email($str){

     return (preg_match('/^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,4}$/',$str))?true:false;

}



//驗證電話號碼

function fun_phone($str)

{

   return (preg_match("/^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$/",$str))?true:false;

}



//驗證郵編

function fun_zip($str)

{

   return (preg_match("/^[1-9]\d{5}$/",$str))?true:false;

}



//驗證url地址

function fun_url($str)

{

   return (preg_match("/^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/",$str))?true:false;

}

  

//二維陣列按照鍵值排序
function array_sort($array,$keys,$type='asc'){
    //$array為要排序的陣列,$keys為要用來排序的鍵名,$type預設為升序排序
    $keysvalue = $new_array = array();
    foreach ($array as $k=>$v){
        $keysvalue[$k] = $v[$keys];
    }
    if($type == 'asc'){
        asort($keysvalue);
    }else{
        arsort($keysvalue);
    }
    reset($keysvalue);
    foreach ($keysvalue as $k=>$v){
        $new_array[$k] = $array[$k];
    }
    return $new_array;
}

  

//中文字串擷取
function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true){
    if(function_exists("mb_substr")){
        if($suffix)
             return mb_substr($str, $start, $length, $charset)."...";
        else
            return mb_substr($str, $start, $length, $charset);
    }elseif(function_exists('iconv_substr')) {
        if($suffix)
            return iconv_substr($str,$start,$length,$charset)."...";
        else
            return iconv_substr($str,$start,$length,$charset);
    }

    $re['utf-8']   = "/[x01-x7f]|[xc2-xdf][x80-xbf]|[xe0-xef]
              [x80-xbf]{2}|[xf0-xff][x80-xbf]{3}/";
    $re['gb2312'] = "/[x01-x7f]|[xb0-xf7][xa0-xfe]/";
    $re['gbk']    = "/[x01-x7f]|[x81-xfe][x40-xfe]/";
    $re['big5']   = "/[x01-x7f]|[x81-xfe]([x40-x7e]|xa1-xfe])/";
    preg_match_all($re[$charset], $str, $match);
    $slice = join("",array_slice($match[0], $start, $length));
    if($suffix) return $slice."…";
    return $slice;
 }

  

//笛卡爾積生成
function fun($arr, $tmp = [])
{
    static $list=[];
    foreach (array_shift($arr) AS $v)
    {
        $tmp[] = $v;
        if ($arr)
        {
            fun($arr, $tmp);
        }
        else
        {
            $list[] = $tmp;
        }
        array_pop($tmp);
    }
    return $list;
}

$arr = [
    [1,2,3],
    [2, 3],
    [4, 5],
    [6, 7, 8],
];
var_dump(fun($arr));

  

//流下載+generator
function getLines($file) {
    $f = fopen($file, 'r');
    try {
        while ($line = fgets($f)) {
            yield $line;
        }
    } finally {
        fclose($f);
    }
}

//告訴瀏覽器這是一個檔案流格式的檔案
Header ( "Content-type: application/octet-stream" );
//請求範圍的度量單位
Header ( "Accept-Ranges: bytes" );
//Content-Length是指定包含於請求或響應中資料的位元組長度
Header ( "Accept-Length: " . filesize ( './demo.php' ) );
//用來告訴瀏覽器,檔案是可以當做附件被下載,下載後的檔名稱為$file_name該變數的值。
Header ( "Content-Disposition: attachment; filename=demo.php" );


foreach (getLines("demo.php") as $n => $line) {

    echo $line;

}
exit();

  

### PHP如何高效獲取大檔案(1G以上)行數
#### 一次讀取一部分資料,計算這部分資料中有多少個換行符,不斷迴圈,效率會比順序讀取內容高。
function countLine($file)
{
    $fp = fopen($file, 'r');
    $i  = 0;

    while (!feof($fp)) {
        //每次讀取2M
        if ($data = fread($fp, 1024 * 1024 * 2)) {
            //計算讀取到的行數
            $num = substr_count($data, "\n");
            $i += $num;
        }
    }

    fclose($fp);
    return $i;
}

  

  //駝峰命名轉下劃線命名
function toUnderScore($str) {
    $dstr = preg_replace_callback('/([A-Z]+)/', function ($matchs) {
        return '_' . strtolower($matchs[0]);
    }, $str);

    return trim(preg_replace('/_{2,}/', '_', $dstr), '_');
}

//下劃線命名到駝峰命名
function toCamelCase($str) {
    $array = explode('_', $str);
    $result = $array[0];
    $len = count($array);
    if ($len > 1) {
        for ($i = 1; $i < $len; $i++) {
            $result .= ucfirst($array[$i]);
        }
    }

    return $result;
}

  

//時間相關 
echo "今天:".date("Y-m-d")."<br>";
echo "昨天:".date("Y-m-d",strtotime("-1 day")), "<br>";
echo "明天:".date("Y-m-d",strtotime("+1 day")). "<br>";
echo "一週後:".date("Y-m-d",strtotime("+1 week")). "<br>";
echo "一週零兩天四小時兩秒後:".date("Y-m-d G:H:s",strtotime("+1 week 2 days 4 hours 2 seconds")). "<br>";
echo "下個星期四:".date("Y-m-d",strtotime("next Thursday")). "<br>";
echo "上個週一:".date("Y-m-d",strtotime("last Monday"))."<br>";
echo "一個月前:".date("Y-m-d",strtotime("last month"))."<br>";
echo "一個月後:".date("Y-m-d",strtotime("+1 month"))."<br>";
echo "十年後:".date("Y-m-d",strtotime("+10 year"))."<br>";

  

//無限極分類這個是核心方法
function generateTree($items){
    $tree = array();
    foreach($items as $item){
        if(isset($items[$item['pid']]) || $items[$item['pid']]==0){
            $items[$item['pid']]['son'][] =& $items[$item['id']];
        }else{
            $tree[] =& $items[$item['id']];
        }
    }
    return $tree;
}
//這個是從發資料庫中取出的資料
$items = array(
    1 => array('id' => 1, 'pid' => 0, 'name' => '安徽省'),
    2 => array('id' => 2, 'pid' => 0, 'name' => '浙江省'),
    3 => array('id' => 3, 'pid' => 1, 'name' => '合肥市'),
    4 => array('id' => 4, 'pid' => 3, 'name' => '長豐縣'),
    5 => array('id' => 5, 'pid' => 1, 'name' => '安慶市'),
);
print_r(generateTree($items));