PHP开发PHP经验分享PHP实战

TP5常用的封装方法(1)

2020-04-08  本文已影响0人  华仔233
1、二维数组根据pid生成多维树 (注意:父级必须排在数组前面,降维的生成树方法)
/**
 * 二维数组根据pid生成多维树
 * @param $list 父子级拼接数组传入
 * @param $pid 父级ID字段
 * @param $child 子集
 * @return array
 */
function listToTree($list, $pid = 'pid', $child = 'children')
{
    $tree = array();// 创建Tree
    if (is_array($list)) {
        // 创建基于主键的数组引用
        $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];
                $list[$key][$child] = [];
            } else {
                if (isset($refer[$parentId])) {
                    $parent = &$refer[$parentId];
                    $parent[$child][] = &$list[$key];
                }
            }
        }
    }
    return $tree;
}
2、根据相关键值生成父子关系(二维生成树)
/**
 * 根据相关键值生成父子关系
 * @param array $arr1 数组1
 * @param array $arr2 数组2
 * @param string $arr1_key 数组1对应的键值
 * @param string $arr2_key 数组2对应的父级键值
 * @param string $child 合并的数组键值
 */
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;
            }
        }
    }
}
3、二维数组根据键值排序
/**
 * 二维数组根据键值排序
 * @param array $array 要排序的数组
 * @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); //重置键值
}
4、获取上周/这周7天时间
/**
 * 获取上周的时间数组
 * @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;
}
5、将时间戳转换成多久之前
/**
 * 时间戳转换
 * @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 . '前';
        }
    }
}
6、将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;
}
上一篇下一篇

猜你喜欢

热点阅读