常用函式PHP
阿新 • • 發佈:2020-08-28
//驗證是否為指定長度的字母/數字組合 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));