TP5 常用的公共函數(shù)(長期更新)

以下都是使用tp5框架愧口,本人封裝的常用方法

1舞虱、數(shù)組系列

1.1欢际、二維數(shù)組根據(jù)pid生成多維樹 (注意:父級必須排在數(shù)組前面,降維的生成樹方法)
/**
 * 二維數(shù)組根據(jù)pid生成多維樹
 * @param $list 父子級拼接數(shù)組傳入
 * @param $pid 父級ID字段
 * @param $child 子集
 * @return array
 */
function listToTree($list, $pid = 'pid', $child = 'children')
{
    $tree = array();// 創(chuàng)建Tree
    if (is_array($list)) {
        // 創(chuàng)建基于主鍵的數(shù)組引用
        $refer = array();
        foreach ($list as $key => $data) $refer[$data['id']] = &$list[$key];

        foreach ($list as $key => $data) {
            // 判斷是否存在parent
            $parentId = $data[$pid];

            if (0 == $parentId) {
                $tree[] = &$list[$key];
                if(isset($list[$key][$child]) && !$list[$key][$child]){
                    $list[$key][$child] = [];
                }
            } else {
                if (isset($refer[$parentId])) {
                    $parent = &$refer[$parentId];
                    $parent[$child][] = &$list[$key];
                }
            }
        }
    }
    return $tree;
}
1.2矾兜、根據(jù)相關鍵值生成父子關系(二維生成樹)
/**
 * 根據(jù)相關鍵值生成父子關系
 * @param array $arr1 數(shù)組1
 * @param array $arr2 數(shù)組2
 * @param string $arr1_key 數(shù)組1對應的鍵值
 * @param string $arr2_key 數(shù)組2對應的父級鍵值
 * @param string $child 合并的數(shù)組鍵值
 */
function listToTree2(&$arr1, $arr2, $arr1_key = 'id', $arr2_key = 'pid', $child = 'children')
{
    foreach ($arr1 as $i => &$item1) {
        foreach ($arr2 as $j => $item2) {
            if ($item1[$arr1_key] == $item2[$arr2_key]) {
                if (!isset($item1[$child]) || !is_array($item1[$child])) $item1[$child] = [];
                $item1[$child][] = $item2;
            }
        }
    }
}
1.3损趋、二維數(shù)組根據(jù)鍵值排序
/**
 * 二維數(shù)組根據(jù)鍵值排序
 * @param array $array 要排序的數(shù)組
 * @param string $keys 要用來排序的鍵名
 * @param string $type 默認為降序排序
 * @return array
 */
function arraySort($array, $keys, $type = 'desc')
{
    //將排序的鍵名作為鍵值
    $keysValue = $newArray = [];
    foreach ($array as $k => $v) $keysValue[$k] = $v[$keys];

    ($type == 'asc' || $type == 'ASC') ? asort($keysValue) : arsort($keysValue);
    reset($keysValue); //重置指針

    foreach ($keysValue as $k => $v) $newArray[$k] = $array[$k];

    return array_values($newArray); //重置鍵值
}
1.4、一維/二維數(shù)組根據(jù)關鍵字對數(shù)組字段進行相似度排序
/**
 * 一維/二維數(shù)組根據(jù)關鍵字對數(shù)組字段進行相似度排序
 * @param array $array 原數(shù)組
 * @param string $keyword 關鍵字
 * @param string $field 要匹配的數(shù)組字段名,不傳則表示一維數(shù)組
 * @param int $limit 限制次數(shù)焕刮,-1不限制
 * @return  array    排序好的數(shù)組
 */
function similarArrSort(array $array, string $keyword, $field = '', $limit = -1)
{
    //數(shù)組key小于3舶沿,直接返回,不符合排序要求(特例配并,可不寫)
    if (count($array) <= 3 || ($limit != -1 && $limit <= 3)) {
        return $array;
    }

    $newField = $field; //賦值

    //如果傳入的field為空則表示一維數(shù)組括荡,生成field為label的二維數(shù)組
    if ($field == '') {
        $label2 = [];
        foreach ($array as $k => $value) $label2[$k]['label'] = $value;
        $array = $label2;
        $newField = 'label';
    }

    //數(shù)組相似度處理
    foreach ($array as $key => $value) {
        similar_text($value[$newField], $keyword, $percent);

        $value['percent'] = $percent;
        $data[] = $value;

    }

    //取出數(shù)組中percent的一列,返回一維數(shù)組
    $percent = array_column($data, 'percent');

    //排序溉旋,根據(jù) percent 排序
    array_multisort($percent, SORT_DESC, $data);

    //一維數(shù)組處理返回一維數(shù)組
    if ($field == '') {
        $newData = [];
        foreach ($data as $k => $v) $newData[$k] = $v[$newField];
        $data = $newData;
    }

    //限制返回數(shù)量
    if ($limit != -1) {
        $data = array_slice($data, 0, $limit);
    }

    return $data;
}
1.5畸冲、二維數(shù)組去重(支持多字段同時匹配去重)
function moreArrayUnique($arr, $field = [], $allField = true)
{
    //必須是傳入數(shù)組
    if (!is_array($field)) return false;

    //先把二維數(shù)組中的內層數(shù)組的鍵值記錄在在一維數(shù)組中
    foreach ($arr[0] as $k => $v) $allField[] = $k;
    if ($field) {
        //按照順序排字段名
        foreach ($allField as $key => $val) {
            if (!in_array($val, $field)) unset($allField[$key]);
        }
        $field = $allField;
    }

    foreach ($arr as $k => $v) {
        foreach ($v as $key => $item) {
            if (!in_array($key, $field)) unset($v[$key]);
        }
        //降維 用implode()也行
        $v = implode(",", $v);
        //保留原來的鍵值 $temp[]即為不保留原來鍵值
        $temp[$k] = $v;
    }

    //去重:去掉重復的元素
    $arr = array_unique($temp);
    if ($allField) {
        foreach ($arr as $k => $v) {
            //拆分后的重組 如:Array( [0] => 張三 [1] => 18 )
            $a = explode(",", $v);
            //將原來的鍵與值重新合并
            $arrAfter[] = array_combine($field, $a);
        }

    } else {
        //將鍵值保存為一維數(shù)組
        $allKey = array_keys($temp);
        $arrAfter = [];
        foreach ($arr as $k => $v) {
            //數(shù)組去重
            if (!in_array($k, $allKey)) {
                unset($arr[$k]);
            } else {
                $a = explode(",", $v);
                $arrAfter[] = array_combine($field, $a);
            }
        }
    }

    return $arrAfter ?? false;
}
1.6、一層遍歷實現(xiàn)2個二維數(shù)組的合并
$arr1 = [
    'a'=>[1],
    'b'=>[2],
];
$arr2= [
    'a'=>[4],
    'b'=>[51],
    'c'=>[111]
];
$key1 = array_keys($arr1);
$key2 = array_keys($arr2);
$key = array_unique(array_merge($key1,$key2));
$arr = [];
foreach($key as $k => $v){
    if(isset($arr1[$v]) && isset($arr2[$v])){
        $arr[$v] = array_merge($arr1[$v],$arr2[$v]);
    }else if (isset($arr1[$v])){
        $arr[$v] = $arr1[$v];
    }else if(isset($arr2[$v])){
        $arr[$v] = $arr2[$v];
    }
}

var_dump($arr);
1.7观腊、自定義分頁效果
/**
 * 將多維數(shù)組繼續(xù)分頁邑闲,自定義分頁效果
 * @param array &$array 數(shù)組
 * @param int $page 當前頁數(shù)
 * @param int $limit 每頁頁數(shù)
 * @param int $order 0-不變 1-反序
 * @param bool $preserveKey true - 保留鍵名  false - 默認。重置鍵名
 */
function arrayToPage(Array &$array, int $page = 1, int $limit = 20, int $order = 0,bool $preserveKey = false)
{
    $start = ($page - 1) * $limit; //計算每次分頁的開始位置

    //反序
    if ($order == 1) $array = array_reverse($array);

    $array = array_slice($array, $start, $limit,$preserveKey);
}

2梧油、時間類

2.1苫耸、將時間戳轉換成多久之前
/**
 * 時間戳轉換
 * @param $time
 * @return string
 */
function timeToBefore(int $time)
{
    $t = time() - $time;
    $f = array(
        '31536000' => '年',
        '2592000' => '個月',
        '604800' => '星期',
        '86400' => '天',
        '3600' => '小時',
        '60' => '分鐘',
        '1' => '秒'
    );
    foreach ($f as $k => $v) {
        if (0 != $c = floor($t / (int)$k)) {
            return $c . $v . '前';
        }
    }
}
2.2、獲取上周/這周7天時間
/**
 * 獲取上周的時間數(shù)組
 * @param $day 獲取當前周的第幾天 周日是 0 周一到周六是1-6  
 * @param $format 日期格式
 * @param $last 是否獲取上周儡陨,1=上周7天褪子,0=這周7天
 * @return array
 */
function getWeekDayArr(int $day, string $format = 'Ymd', int $last = 1)
{
    if ($last == 1) {
        //獲取本周開始日期量淌,如果$day是0是周日:-6天;其它:$day-1天  
        $beginLastweek = strtotime(date($format) . ' -' . ($day ? $day - 1 : 6) . ' days');
        $curMonday = date($format, $beginLastweek);
        $startDay = date($format, strtotime("$curMonday -7 days"));
        $data = [
            $startDay,
            date($format, strtotime("$startDay +1 days")),
            date($format, strtotime("$startDay +2 days")),
            date($format, strtotime("$startDay +3 days")),
            date($format, strtotime("$startDay +4 days")),
            date($format, strtotime("$startDay +5 days")),
            date($format, strtotime("$startDay +6 days")),
        ];
    } else {
        //獲取當前周幾
        //獲取本周開始日期,如果$day是0是周日:-6天;其它:$day-1天
        $week = date('w', time()) - $day + 1;
        $data = [];
        for ($i = 1; $i <= 7; $i++) {
            $data[$i] = date($format, strtotime('+' . $i - $week . ' days'));
        }
    }

    return $data;
}
2.3嫌褪、計算兩日期相差天數(shù)

/**
 * 計算兩日期相差天數(shù)
 * @param string $endTime 結束時間
 * @param string $startTime 開始時間
 * @param int $flag 傳入日期格式(0-時間戳,1-日期格式)
 * @return false|float
 */
function calDifferentDay($endTime = '', $startTime = '', $flag = 1)
{
    //轉換為天呀枢,取出時分秒
    $startTime = ($startTime == '') ? date('Y-m-d H:i:s', time()) : $startTime;
    $endTime = ($endTime == '') ? date('Y-m-d H:i:s', time()) : $endTime;

    if ($flag) {
        $startTime = strtotime($startTime);
        $endTime = strtotime($endTime);
    }

    $startTime = floor($startTime / 86400);
    $endTime = floor($endTime / 86400);
    return $endTime - $startTime;
}
2.4、檢驗日期格式是否正確
/**
 * 檢驗日期格式是否正確
 * @param string $date 日期格式是 2020-01-21
 * @return bool
 */
function validDate($date)
{
    //匹配日期格式
    if (preg_match("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/", $date, $parts)) {
        //檢測是否為日期,checkdate為月日年
        if (checkdate($parts[2], $parts[3], $parts[1])) return true;
        return false;
    }

    return false;
}

3笼痛、字符串/中文系列

3.1裙秋、將unicode轉中文
/**
 * unicode轉中文
 * @param string $name unicode
 * @return string
 */
function unicodeDecode($name)
{
    // 轉換編碼,將Unicode編碼轉換成可以瀏覽的utf-8編碼
    $pattern = '/([\w]+)|(\\\u([\w]{4}))/i';
    preg_match_all($pattern, $name, $matches);
    if (!empty($matches)) {
        $name = '';
        for ($j = 0; $j < count($matches[0]); $j++) {
            $str = $matches[0][$j];
            if (strpos($str, '\\u') === 0) {
                $code = base_convert(substr($str, 2, 2), 16, 10);
                $code2 = base_convert(substr($str, 4), 16, 10);
                $c = chr($code) . chr($code2);
                $c = iconv('UCS-2', 'UTF-8', $c);
                $name .= $c;
            } else {
                $name .= $str;
            }
        }
    }
    return $name;
}
3.2缨伊、生成隨機中文漢字
/**
 * 隨機中文漢字
 * @param int $num 數(shù)量
 * @return string 返回隨機中文漢字
 */
function getChineseChar($num)
{
    $ch = '';
    for ($i = 0; $i < $num; $i++) {
        // 使用chr()函數(shù)拼接雙字節(jié)漢字摘刑,前一個chr()為高位字節(jié),后一個為低位字節(jié)
        $chr = chr(mt_rand(0xB0, 0xD0)) . chr(mt_rand(0xA1, 0xF0));
        // 轉碼
        $ch .= iconv('GB2312', 'UTF-8', $chr);
    }
    return $ch;
}
3.3刻坊、生成隨機字符串
/**
 * 生成隨機字符串
 * @param int $length
 * @return string
 */
function getRandomStr($length = 6) {
    $chars = '123456789abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ';
    $hash = '';
    $max = strlen($chars) - 1;
    for($i = 0; $i < $length; $i++) $hash .= $chars[mt_rand(0, $max)];

    return $hash;
}
3.4泣侮、可控的隱藏手機號
/**
 * @param string|int $str 手機號碼
 * @param int $start 開始位置,從0開始
 * @param int $length 隱藏長度
 * @return bool|string|string[] 
 */
function hidePhone($str, int $start = 3, int $length = 4)
{
    //獲取最后一位
    $end = $start + $length;
    //判斷傳參是否正確
    if ($start < 0 || $end > 11) return false;

    $replace = ''; //用于判斷多少
    for ($i = 0; $i < $length; $i++) $replace .= '*';
    return substr_replace($str, $replace, $start, $length);
}
3.6紧唱、國內國際手機號正則匹配(待完善)
/**
 * 國內國際手機號正則匹配(待完善)
 * @param int $areaCode 國際區(qū)號
 * @param string $mobile 手機號
 * @return false|int
 */
function mathMobile(int $areaCode,string $mobile)
{
    if ($areaCode == 86) {
        //中國大陸 11位
        $reg = '/^1[3|4|5|7|8|9][0-9]{9}$/'; //手機正則匹配
    } elseif ($areaCode == 852) {
        //中國香港 8位
        $reg = '/^[9|6]\d{7}$/'; //手機正則匹配
    } elseif ($areaCode == 886) {
        //中國臺灣
        $reg = '/^9{8}$/'; //手機正則匹配
    } elseif ($areaCode == 853) {
        //中國澳門
        $reg = '/^6[6|8]\d{6}$/'; //手機正則匹配
    }
    return preg_match($reg, $mobile);
}

3.6、阿拉伯數(shù)字轉換成中文數(shù)字(例如:100 → 一百)
/**
 * @param int $num 阿拉伯數(shù)字
 * @return mixed|string
 */
function numToWord(int $num)
{
    $chiNum = array('零', '一', '二', '三', '四', '五', '六', '七', '八', '九');
    $chiUni = array('', '十', '百', '千', '萬', '億', '十', '百', '千');
    $num_str = (string)$num;
    $count = strlen($num_str);

    $last_flag = true; //上一個 是否為0
    $zero_flag = true; //是否第一個
    $temp_num = null; //臨時數(shù)字
    $chiStr = '';//拼接結果

    if ($count == 2) {//兩位數(shù)
        $temp_num = $num_str[0];
        $chiStr = $temp_num == 1 ? $chiUni[1] : $chiNum[$temp_num] . $chiUni[1];
        $temp_num = $num_str[1];
        $chiStr .= $temp_num == 0 ? '' : $chiNum[$temp_num];

    } else if ($count > 2) {
        $index = 0;
        for ($i = $count - 1; $i >= 0; $i--) {
            $temp_num = $num_str[$i];
            if ($temp_num == 0) {
                if (!$zero_flag && !$last_flag) {
                    $chiStr = $chiNum[$temp_num] . $chiStr;
                    $last_flag = true;
                }
            } else {
                $chiStr = $chiNum[$temp_num] . $chiUni[$index % 9] . $chiStr;
                $zero_flag = false;
                $last_flag = false;
            }
            $index++;
        }

    } else {
        $chiStr = $chiNum[$num_str[0]];
    }
    return $chiStr;
}
3.7隶校、將圖片轉換成base64編碼
/**
 * 將圖片轉換成base64編碼
 * @param $image_path string 圖片路徑
 * @param bool $is_full 是否加上圖片前綴
 * @return string
 */
function base64EncodeImage($image_path, $is_full = true)
{
    $base64_image = '';
    $image_info = getimagesize($image_path);
    $image_data = fread(fopen($image_path, 'r'), filesize($image_path));
    if ($is_full) {
        //data:image/jpg/png/gif;base64,
        $base64_image = 'data:' . $image_info['mime'] . ';base64,' . base64_encode($image_data);
    } else {
        $base64_image = base64_encode($image_data);
    }
    return $base64_image;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末漏益,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子深胳,更是在濱河造成了極大的恐慌绰疤,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舞终,死亡現(xiàn)場離奇詭異轻庆,居然都是意外死亡,警方通過查閱死者的電腦和手機敛劝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門余爆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人夸盟,你說我怎么就攤上這事蛾方。” “怎么了上陕?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵桩砰,是天一觀的道長。 經(jīng)常有香客問我释簿,道長亚隅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任庶溶,我火速辦了婚禮煮纵,結果婚禮上懂鸵,老公的妹妹穿的比我還像新娘。我一直安慰自己醉途,他們只是感情好矾瑰,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著隘擎,像睡著了一般殴穴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上货葬,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天采幌,我揣著相機與錄音,去河邊找鬼震桶。 笑死休傍,一個胖子當著我的面吹牛,可吹牛的內容都是我干的蹲姐。 我是一名探鬼主播磨取,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼柴墩!你這毒婦竟也來了忙厌?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤江咳,失蹤者是張志新(化名)和其女友劉穎逢净,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歼指,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡爹土,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了踩身。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胀茵。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖惰赋,靈堂內的尸體忽然破棺而出宰掉,到底是詐尸還是另有隱情,我是刑警寧澤赁濒,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布轨奄,位于F島的核電站,受9級特大地震影響拒炎,放射性物質發(fā)生泄漏挪拟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一击你、第九天 我趴在偏房一處隱蔽的房頂上張望玉组。 院中可真熱鬧谎柄,春花似錦、人聲如沸惯雳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽石景。三九已至劈猿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間潮孽,已是汗流浹背揪荣。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留往史,地道東北人仗颈。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像椎例,于是被迫代替她去往敵國和親挨决。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內容

  • 首先給大家介紹javascript jquery中定義數(shù)組與操作的相關知識订歪,具體內容如下所示: 1.認識數(shù)組 數(shù)組...
    JamHsiao_aaa4閱讀 1,944評論 0 2
  • 一凰棉、數(shù)組定義 array() 1、索引數(shù)組 在一個變量中陌粹,存儲一個或多個值。數(shù)組中的每一個元素都有一個訪問ID福压,根...
    竹與豆閱讀 535評論 0 0
  • 轉載:在開發(fā)中荆姆,數(shù)組的使用場景非常多蒙幻,平日中也涉及到很多數(shù)組的api/相關操作,一直也沒有對這塊內容進行一塊整理總...
    七色煙火閱讀 3,227評論 0 3
  • 排序的基本概念 在計算機程序開發(fā)過程中胆筒,經(jīng)常需要一組數(shù)據(jù)元素(或記錄)按某個關鍵字進行排序邮破,排序完成的序列可用于快...
    Jack921閱讀 1,438評論 1 4
  • 1.strlen()與mb_strlen()的作用分別是什么? strlen()和mb_strlen()都是作用于...
    落魄PHP女程序員閱讀 358評論 0 2