使用者自定義函式是指如果要在公式或計算中使用特別複雜的計算,而工作表函式又無法滿足需要,則需要建立使用者自定義函式。這些函式,稱為使用者自定義函式
1.一個函式可由以下的語法來定義:
<?php
function foo($arg_1, $arg_2, /* ..., */ $arg_n)
{
echo "Example function.\n";
return $retval;
}
?>
任何有效的 PHP 程式碼都有可能出現在函式內部,甚至包括其它函式和類定義。
2.格式化位元組大小
/**
* 格式化位元組大小
* @param number $size 位元組數
* @param string $delimiter 數字和單位分隔符
* @return string 格式化後的帶單位的大小
*/
function get_byte($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];
}
3.生成隨機字串
/**
* 產生隨機字串
*
* @param int $length 輸出長度
* @param string $chars 可選的 ,預設為 0123456789
* @return string 字串
*/
function get_random($length, $chars = '0123456789') {
$hash = '';
$max = strlen($chars) - 1;
for($i = 0; $i < $length; $i++) {
$hash .= $chars[mt_rand(0, $max)];
}
return $hash;
}
4.建立圖片上傳目錄和縮圖目錄
function my_mkdir($Folder){ // 建立圖片上傳目錄和縮圖目錄
if(!is_dir($Folder)){
$dir = explode('/',$Folder);
foreach($dir as $v){
if($v){
$d .= $v . '/';
if(!is_dir($d)){
$state = mkdir($d);
if(!$state){
die('在建立目錄' . $d . '時出錯!');
}
}
}
}
}
}
5.迴圈刪除目錄和檔案函式
/**
* 迴圈刪除目錄和檔案函式
* @param string $dirName 路徑
* @param boolean $fileFlag 是否刪除目錄
* @return void
*/
function del_dir_file($dirName, $bFlag = false ) {
if ( $handle = opendir( "$dirName" ) ) {
while ( false !== ( $item = readdir( $handle ) ) ) {
if ( $item != "." && $item != ".." ) {
if ( is_dir( "$dirName/$item" ) ) {
del_dir_file("$dirName/$item", $bFlag);
} else {
unlink( "$dirName/$item" );
}
}
}
closedir( $handle );
if($bFlag) rmdir($dirName);
}
}
6.刪除目錄及目錄下所有檔案或刪除指定檔案
/**
* 刪除目錄及目錄下所有檔案或刪除指定檔案
* @param str $path 待刪除目錄路徑
* @param int $delDir 是否刪除目錄,1或true刪除目錄,0或false則只刪除檔案保留目錄(包含子目錄)
* @return bool 返回刪除狀態
*/
function del_dir_and_file($path, $delDir = FALSE) {
$handle = opendir($path);
if ($handle) {
while (false !== ( $item = readdir($handle) )) {
if ($item != "." && $item != "..")
is_dir("$path/$item") ? del_dir_and_file("$path/$item", $delDir) : unlink("$path/$item");
}
closedir($handle);
if ($delDir)
return rmdir($path);
}else {
if (file_exists($path)) {
return unlink($path);
} else {
return FALSE;
}
}
}
7.將xml轉為array
/**
* 作用:將xml轉為array
*/
function xmlToArray($xml) {
//將XML轉為array
$array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $array_data;
}
8.遞迴重組資訊為多維
/**
* 遞迴重組資訊為多維
* @param string $dirName 路徑
* @param boolean $fileFlag 是否刪除目錄
* @return void
*/
function node_merge($attr, $arr) {
foreach($attr as $v){
if (is_array($arr)){
$v['access'] = in_array($v['id'],$arr) ? 1: 0;
}
}
return $attr;
}
9.獲取檔案資訊
/**
* 獲取檔案資訊
* @param string $filepath 路徑
* @param string $key 指定返回某個鍵值資訊
* @return array
*/
function get_file_info($filepath='', $key=''){
//開啟檔案,r表示以只讀方式開啟
$handle = fopen($filepath,"r");
//獲取檔案的統計資訊
$fstat = fstat($handle);
fclose($handle);
$fstat['filename'] = basename($filepath);
if(!empty($key)){
return $fstat[$key];
}else{
return $fstat;
}
}
10.獲取檔案目錄列表
/**
* 獲取檔案目錄列表
* @param string $pathname 路徑
* @param integer $fileFlag 檔案列表 0所有檔案列表,1只讀資料夾,2是隻讀檔案(不包含資料夾)
* @param string $pathname 路徑
* @return array
*/
function get_file_folder_List($pathname,$fileFlag = 0, $pattern='*') {
$fileArray = array();
$pathname = rtrim($pathname,'/') . '/';
$list = glob($pathname.$pattern);
foreach ($list as $i => $file) {
switch ($fileFlag) {
case 0:
$fileArray[]=basename($file);
break;
case 1:
if (is_dir($file)) {
$fileArray[]=basename($file);
}
break;
case 2:
if (is_file($file)) {
$fileArray[]=basename($file);
}
break;
default:
break;
}
}
if(empty($fileArray)) $fileArray = NULL;
return $fileArray;
}
11.非遞迴實現查詢該目錄下所有檔案
/**
* PHP 非遞迴實現查詢該目錄下所有檔案
* @param unknown $dir
* @return multitype:|multitype:string
*/
function scanfiles($dir) {
if (! is_dir ( $dir )) return array ();
// 相容各作業系統
$dir = rtrim ( str_replace ( '\\', '/', $dir ), '/' ) . '/';
// 棧,預設值為傳入的目錄
$dirs = array ( $dir );
// 放置所有檔案的容器
$rt = array ();
do {
// 彈棧
$dir = array_pop ( $dirs );
// 掃描該目錄
$tmp = scandir ( $dir );
foreach ( $tmp as $f ) {
// 過濾. ..
if ($f == '.' || $f == '..')
continue;
// 組合當前絕對路徑
$path = $dir . $f;
// 如果是目錄,壓棧。
if (is_dir ( $path )) {
array_push ( $dirs, $path . '/' );
} else if (is_file ( $path )) { // 如果是檔案,放入容器中
$rt [] = $path;
}
}
} while ( $dirs ); // 直到棧中沒有目錄
return $rt;
}
12.反字元 去標籤 自動加點 去換行 擷取字串
/**
* 反字元 去標籤 自動加點 去換行 擷取字串
*/
function cutstr ($data, $no, $le = '') {
$data = strip_tags(htmlspecialchars_decode($data));
$data = str_replace(array("\r\n", "\n\n", "\r\r", "\n", "\r"), '', $data);
$datal = strlen($data);
$str = msubstr($data, 0, $no);
$datae = strlen($str);
if ($datal > $datae)
$str .= $le;
return $str;
}
13.字串擷取
/**
* [字串擷取]
* @param [type] $Str [字串]
* @param [type] $Length [長度]
* @param boolean $more [模型]
* @return [type] [擷取後的字串]
*/
function cut($Str, $Length,$more=true) {//$Str為擷取字串,$Length為需要擷取的長度
global $s;
$i = 0;
$l = 0;
$ll = strlen($Str);
$s = $Str;
$f = true;
while ($i <= $ll) {
if (ord($Str{$i}) < 0x80) {
$l++; $i++;
} else if (ord($Str{$i}) < 0xe0) {
$l++; $i += 2;
} else if (ord($Str{$i}) < 0xf0) {
$l += 2; $i += 3;
} else if (ord($Str{$i}) < 0xf8) {
$l += 1; $i += 4;
} else if (ord($Str{$i}) < 0xfc) {
$l += 1; $i += 5;
} else if (ord($Str{$i}) < 0xfe) {
$l += 1; $i += 6;
}
if (($l >= $Length - 1) && $f) {
$s = substr($Str, 0, $i);
$f = false;
}
if (($l > $Length) && ($i < $ll) && $more) {
$s = $s . '...'; break; //如果進行了擷取,字串末尾加省略符號“...”
}
}
return $s;
}
14.將一個字串轉換成陣列,支援中文
/**
* 將一個字串轉換成陣列,支援中文
* @param string $string 待轉換成陣列的字串
* @return string 轉換後的陣列
*/
function strToArray($string) {
$strlen = mb_strlen($string);
while ($strlen) {
$array[] = mb_substr($string, 0, 1, "utf8");
$string = mb_substr($string, 1, $strlen, "utf8");
$strlen = mb_strlen($string);
}
return $array;
}
15.object_array
function object_array($array) {
if(is_object($array)) {
$array = (array)$array;
} if(is_array($array)) {
foreach($array as $key=>$value) {
$array[$key] = object_array($value);
}
}
return $array;
}
16.對查詢結果集進行排序
/**
* 對查詢結果集進行排序
* @access public
* @param array $list 查詢結果
* @param string $field 排序的欄位名
* @param array $sortby 排序型別
* asc正向排序 desc逆向排序 nat自然排序
* @return array
*/
function list_sort_by($list,$field, $sortby='asc') {
if(is_array($list)){
$refer = $resultSet = array();
foreach ($list as $i => $data)
$refer[$i] = &$data[$field];
switch ($sortby) {
case 'asc': // 正向排序
asort($refer);
break;
case 'desc':// 逆向排序
arsort($refer);
break;
case 'nat': // 自然排序
natcasesort($refer);
break;
}
foreach ( $refer as $key=> $val)
$resultSet[] = &$list[$key];
return $resultSet;
}
return false;
}
17.把返回的資料集轉換成Tree
/**
* 把返回的資料集轉換成Tree
* @param array $list 要轉換的資料集
* @param string $pid parent標記欄位
* @param string $level level標記欄位
* @return array
* @author 麥當苗兒 <zuojiazi@vip.qq.com>
*/
function list_to_tree($list, $pk='id', $pid = 'pid', $child = '_child', $root = 0) {
// 建立Tree
$tree = array();
if(is_array($list)) {
// 建立基於主鍵的陣列引用
$refer = array();
foreach ($list as $key => $val) {
$refer[$val[$pk]] =& $list[$key];
}
foreach ($list as $key => $val) {
// 判斷是否存在parent
$parentId = $val[$pid];
if ($root == $parentId) {
$tree[] =& $list[$key];
}else{
if (isset($refer[$parentId])) {
$parent =& $refer[$parentId];
$parent[$child][] =& $list[$key];
}
}
}
}
return $tree;
}
18.將list_to_tree的樹還原成列表
/**
* 將list_to_tree的樹還原成列表
* @param array $tree 原來的樹
* @param string $child 孩子節點的鍵
* @param string $order 排序顯示的鍵,一般是主鍵 升序排列
* @param array $list 過渡用的中間陣列,
* @return array 返回排過序的列表陣列
* @author yangweijie <yangweijiester@gmail.com>
*/
function tree_to_list($tree, $child = '_child', $order='id', &$list = array()){
if(is_array($tree)) {
$refer = array();
foreach ($tree as $key => $value) {
$reffer = $value;
if(isset($reffer[$child])){
unset($reffer[$child]);
tree_to_list($value[$child], $child, $order, $list);
}
$list[] = $reffer;
}
$list = list_sort_by($list, $order, $sortby='asc');
}
return $list;
}
19.二維陣列去重與排序
二維陣列去重
public function assoc_unique(&$arr, $key){
$rAr = array();
for($i=0;$i<count($arr);$i++) {
if(!isset($rAr[$arr[$i][$key]])) {
$rAr[$arr[$i][$key]]=$arr[$i];
}
}
return array_values($rAr);
}
二位陣列排序
方法一
public function array_sort($arrays, $sort_key, $sort_order = SORT_ASC, $sort_type = SORT_NUMERIC)
{
if (is_array($arrays)) {
foreach ($arrays as $array) {
if (is_array($array)) {
$key_arrays[] = $array[$sort_key];
} else {
return false;
}
}
} else {
return false;
}
array_multisort($key_arrays, $sort_order, $sort_type, $arrays);
return $arrays;
}
方法二
public function array_sort($arr,$key,$value){
$temp = array();
foreach ($arr as $k => $v){
if($v[$key] == $value){
$temp[] = $arr[$k];
unset($arr[$k]);
}
}
foreach ($temp as $m => $n){
array_push($arr,$n);
}
return $arr;
}
20.獲取二維陣列中的一個鍵的值的陣列
/**
* 獲取二維陣列中的一個鍵的值的陣列
* @param $input
* @param $columnKey
* @param null $indexKey
* @return array
*/
public function array_column($input, $columnKey, $indexKey = NULL)
{
$columnKeyIsNumber = (is_numeric($columnKey)) ? TRUE : FALSE;
$indexKeyIsNull = (is_null($indexKey)) ? TRUE : FALSE;
$indexKeyIsNumber = (is_numeric($indexKey)) ? TRUE : FALSE;
$result = array();
foreach ((array)$input AS $key => $row) {
if ($columnKeyIsNumber) {
$tmp = array_slice($row, $columnKey, 1);
$tmp = (is_array($tmp) && !empty($tmp)) ? current($tmp) : NULL;
} else {
$tmp = isset($row[$columnKey]) ? $row[$columnKey] : NULL;
}
if (!$indexKeyIsNull) {
if ($indexKeyIsNumber) {
$key = array_slice($row, $indexKey, 1);
$key = (is_array($key) && !empty($key)) ? current($key) : NULL;
$key = is_null($key) ? 0 : $key;
} else {
$key = isset($row[$indexKey]) ? $row[$indexKey] : 0;
}
}
$result[$key] = $tmp;
}
return $result;
}