以下都是使用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;
}