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ù)相關(guān)鍵值生成父子關(guān)系(二維生成樹)
/**
 * 根據(jù)相關(guān)鍵值生成父子關(guān)系
 * @param array $arr1 數(shù)組1
 * @param array $arr2 數(shù)組2
 * @param string $arr1_key 數(shù)組1對應(yīng)的鍵值
 * @param string $arr2_key 數(shù)組2對應(yīng)的父級鍵值
 * @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ù)關(guān)鍵字對數(shù)組字段進行相似度排序
/**
 * 一維/二維數(shù)組根據(jù)關(guān)鍵字對數(shù)組字段進行相似度排序
 * @param array $array 原數(shù)組
 * @param string $keyword 關(guān)鍵字
 * @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ù)組中的內(nèi)層數(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、將時間戳轉(zhuǎn)換成多久之前
/**
 * 時間戳轉(zhuǎn)換
 * @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 結(jié)束時間
 * @param string $startTime 開始時間
 * @param int $flag 傳入日期格式(0-時間戳,1-日期格式)
 * @return false|float
 */
function calDifferentDay($endTime = '', $startTime = '', $flag = 1)
{
    //轉(zhuǎn)換為天,取出時分秒
    $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轉(zhuǎn)中文
/**
 * unicode轉(zhuǎn)中文
 * @param string $name unicode
 * @return string
 */
function unicodeDecode($name)
{
    // 轉(zhuǎn)換編碼,將Unicode編碼轉(zhuǎn)換成可以瀏覽的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));
        // 轉(zhuǎn)碼
        $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、國內(nèi)國際手機號正則匹配(待完善)
/**
 * 國內(nèi)國際手機號正則匹配(待完善)
 * @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ù)字轉(zhuǎn)換成中文數(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 = '';//拼接結(jié)果

    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、將圖片轉(zhuǎn)換成base64編碼
/**
 * 將圖片轉(zhuǎn)換成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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容