zhengbingdong/php-tools-function

整理全网最全PHP常用开发函数,

v1.0.2 2023-04-25 09:46 UTC

This package is auto-updated.

Last update: 2024-10-25 13:25:42 UTC


README

安装方式

$ composer require zhengbingdong/php-tools-function

更多技术分享请更关注公众号:程序猿的栖息地

程序猿的栖息地

数组工具

1.转树形HTML结构数据
/**
 * 转树形HTML结构数据
 *
 * @param $data         (数据集)
 * @param int $pid      (父级ID)
 * @param string $field (父级字段名)
 * @param string $pk    (主键)
 * @param string $html  (层级文本标识)
 * @param int $level    (当前所在层级)
 * @param bool $clear   (是否清空)
 * @return array
 * @author zero
 */
public static function toTreeHtml($data, int $pid=0, string $field='pid', string $pk='id', string $html='|--', int $level=0, bool $clear=true): array
{
    static $list = [];
    if ($clear) $list = [];

    foreach ($data as $key => $value) {
        if ($value[$field] == $pid) {
            $value['html'] = str_repeat($html, $level);
            $list[] = $value;
            unset($data[$key]);
            self::toTreeHtml($data, $value[$pk], $field, $pk, $html, $level + 1, false);
        }
    }

    return $list;
}
2.转树形JSON格式数据
/**
 * 转树形JSON格式数据
 *
 * @param array $data   (数据集)
 * @param int $pid      (父级ID)
 * @param string $field (字段名称)
 * @param string $pk    (主键)
 * @return array
 * @author zero
 */
public static function toTreeJson(array $data, int $pid=0, string $field='pid', string $pk='id'): array
{
    $tree = array();
    foreach ($data as $value) {
        if ($value[$field] == $pid) {
            $value['children'] = self::toTreeJson($data, $value[$pk], $field, $pk);
            $tree[] = $value;
        }
    }
    return $tree;
}
3.表单多维数据转换
/**
 * 表单多维数据转换
 * 例:
 * 转换前:{"x":0,"a":[1,2,3],"b":[11,22,33],"c":[111,222,3333,444],"d":[1111,2222,3333]}
 * 转换为:[{"a":1,"b":11,"c":111,"d":1111},{"a":2,"b":22,"c":222,"d":2222},{"a":3,"b":33,"c":3333,"d":3333}]
 *
 * @param $arr array (表单二维数组)
 * @param $fill bool (fill为false,返回数据长度取最短,反之取最长,空值自动补充)
 * @return array
 * @author zero
 */
public static function formToLinear(array $arr, bool $fill = false): array
{
    $keys = [];
    $count = $fill ? 0 : PHP_INT_MAX;
    foreach ($arr as $k => $v) {
        if (is_array($v)) {
            $keys[] = $k;
            $count = $fill ? max($count, count($v)) : min($count, count($v));
        }
    }
    if (empty($keys)) {
        return [];
    }
    $data = [];
    for ($i = 0; $i < $count; $i++) {
        foreach ($keys as $v) {
            $data[$i][$v] = $arr[$v][$i] ?? null;
        }
    }
    return $data;
}
4.多维数组合并
/**
 * 多维数组合并
 *
 * @param $array1 (数组1)
 * @param $array2 (数组2)
 * @return array
 * @author zero
 */
public static function arrayMergeMultiple($array1, $array2): array
{
    $merge = $array1 + $array2;
    $data = [];
    foreach ($merge as $key => $val) {
        if (
            isset($array1[$key])
            && is_array($array1[$key])
            && isset($array2[$key])
            && is_array($array2[$key])
        ) {
            $data[$key] = self::arrayMergeMultiple($array1[$key], $array2[$key]);
        } else {
            $data[$key] = $array2[$key] ?? $array1[$key];
        }
    }
    return $data;
}

Url工具

1.转绝对路径
/**
 * 转绝对路径
 * 示例:
 *  转换前: image/20220819/ad06320.jpeg
 *  转换后: http://www.baidu.cn/storage/image/20220819/ad06320.jpeg
 *
 * @param string $url (相对路径)
 * @return string     (绝对路径)
 */
public static function toAbsoluteUrl(string $url = ''): string
{
    if ($url === '' || $url === '/') {
        return $url;
    }

    if (str_starts_with($url, 'http:'.'//') || str_starts_with($url, 'https://')) {
        return $url;
    }

    if (!str_starts_with($url, '/')) {
        $url = '/' . $url;
    }

    if (str_starts_with($url, '/static') || str_starts_with($url, '/temporary')) {
        return request()->domain() . $url;
    }

    $engine = ConfigUtils::get('storage', 'default', 'local');
    if ($engine === 'local') {
        return request()->domain() . $url;
    } else {
        $config = ConfigUtils::get('storage', $engine, []);
        $domain = $config['domain'] ?? '';
        return rtrim($domain, '/') . $url;
    }
}
2.转相对路径
/**
 * 转相对路径
 * 示例:
 *  转换前: http://www.baidu.cn/storage/image/20220819/ad06320.jpeg
 *  转换后: image/20220819/ad06320.jpeg
 *
 * @param string $url (绝对路径)
 * @return string     (相对路径)
 */
public static function toRelativeUrl(string $url): string
{
    if (str_starts_with($url, 'http:'.'//') || str_starts_with($url, 'https://')) {
        $url = str_replace('http:'.'//', '', $url);
        $url = str_replace('https://', '', $url);
        $arr = explode('/', $url);
        array_shift($arr);
        return implode('/', $arr);
    }
    return $url;
}
3.转本地根路径
/**
 * 转本地根路径
 * 示例:
 *  转换前: storage/image/20220819/ad06320.jpeg
 *  转换后: /www/server/wait/public/storage/image/20220819/ad06320.jpeg
 *
 * @param string $url (相对路径)
 * @return string
 * @author zero
 */
public static function toRoot(string $url): string
{
    if (str_starts_with($url, 'http:'.'//') || str_starts_with($url, 'https://')) {
        $url = self::toRelativeUrl($url);
    }

    $rootPath = public_path() . $url;
    $rootPath = str_replace('\\', '/', $rootPath) ;
    return strval($rootPath);
}
4.富文本Src地址提取
/**
 * 富文本Src地址提取
 * 说明: 从富文本中取出所有Src
 *
 * @param string $content
 * @return array
 * @author zero
 */
public static function editorFetchSrc(string $content): array
{
    preg_match_all( '/(src|SRC)=("[^"]*")/i', $content, $match);

    $urls = [];
    foreach ($match[2] as $url) {
        $path = trim($url, '"');
        $urls[] = UrlUtils::toRelativeUrl($path);
    }

    return $urls;
}
5.富文本Src转相对地址
/**
 * 富文本Src转相对地址
 * 说明: 富文本内容里的Src转成相对链接
 *
 * @param string $content
 * @return string
 * @author zero
 */
public static function editorRelativeSrc(string $content): string
{
    $engine = ConfigUtils::get('storage', 'default', 'local');
    // 本地路径
    $domain  = request()->domain() . '/';
    $content = str_replace($domain, '', $content);
    // 云端路径
    if ($engine != 'local') {
        $config = ConfigUtils::get('storage', $engine, []);
        $domain = $config['domain'] ?? 'http'.'://';
        $content = str_replace($domain, '', $content);
    }
    return $content;
}
6.富文本Src转绝对地址
/**
 * 富文本Src转绝对地址
 * 说明: 富文本内容里的Src转成绝对链接
 *
 * @param string $content
 * @return string
 * @author zero
 */
public static function editorAbsoluteSrc(string $content): string
{
    $engine = ConfigUtils::get('storage', 'default', 'local');
    if ($engine !== 'local') {
        $config = ConfigUtils::get('storage', $engine, []);
        $domain = $config['domain'] ?? 'http'.'://';
    } else {
        $domain = request()->domain() . '/';
    }

    $preg = '/(<.*?src=")(?!http|https)(.*?)(".*?>)/is';
    return preg_replace($preg, "\${1}$domain\${2}\${3}", $content);
}

时间工具

1.返回今日开始和结束的时间戳
/**
 * 返回今日开始和结束的时间戳
 *
 * @author zero
 * @return array
 */
public static function today(): array
{
    list($y, $m, $d) = explode('-', date('Y-m-d'));
    return [
        mktime(0, 0, 0, $m, $d, $y),
        mktime(23, 59, 59, $m, $d, $y)
    ];
}
2.返回明天开始和结束时间戳
/**
 * 返回明天开始和结束时间戳
 *
 * @author zero
 * @return array
 */
public static function tomorrow(): array
{
    $date = date("Y-m-d",strtotime("+1 day"));
    return [
        strtotime($date.' 00:00:00'),
        strtotime($date.' 23:59:59')
    ];
}
3.返回昨日开始和结束的时间戳
/**
 * 返回昨日开始和结束的时间戳
 *
 * @author zero
 * @return array
 */
public static function yesterday(): array
{
    $yesterday = date('d') - 1;
    return [
        mktime(0, 0, 0, date('m'), $yesterday, date('Y')),
        mktime(23, 59, 59, date('m'), $yesterday, date('Y'))
    ];
}
4.返回本周开始和结束的时间戳
/**
 * 返回本周开始和结束的时间戳
 *
 * @author zero
 * @return array
 */
public static function week(): array
{
    list($y, $m, $d, $w) = explode('-', date('Y-m-d-w'));
    if($w == 0) $w = 7; //修正周日的问题
    return [
        mktime(0, 0, 0, $m, $d - $w + 1, $y), mktime(23, 59, 59, $m, $d - $w + 7, $y)
    ];
}
5.返回上周开始和结束的时间戳
/**
 * 返回上周开始和结束的时间戳
 *
 * @author zero
 * @return array
 */
public static function lastWeek(): array
{
    $timestamp = time();
    return [
        strtotime(date('Y-m-d', strtotime("last week Monday", $timestamp))),
        strtotime(date('Y-m-d', strtotime("last week Sunday", $timestamp))) + 24 * 3600 - 1
    ];
}
6.返回本月开始和结束的时间戳
/**
 * 返回本月开始和结束的时间戳
 *
 * @return array
 * @author zero
 */
public static function month(): array
{
    list($y, $m, $t) = explode('-', date('Y-m-t'));
    return [
        mktime(0, 0, 0, $m, 1, $y),
        mktime(23, 59, 59, $m, $t, $y)
    ];
}
7.返回今日开始和结束的时间戳
/**
 * 返回上个月开始和结束的时间戳
 *
 * @author zero
 * @return array
 */
public static function lastMonth(): array
{
    $y = date('Y');
    $m = date('m');
    $begin = mktime(0, 0, 0, $m - 1, 1, $y);
    $end = mktime(23, 59, 59, $m - 1, date('t', $begin), $y);

    return [$begin, $end];
}
8.返回今年开始和结束的时间戳
/**
 * 返回今年开始和结束的时间戳
 *
 * @author zero
 * @return array
 */
public static function year(): array
{
    $y = date('Y');
    return [
        mktime(0, 0, 0, 1, 1, $y),
        mktime(23, 59, 59, 12, 31, $y)
    ];
}
9.返回去年开始和结束的时间戳
/**
 * 返回去年开始和结束的时间戳
 *
 * @author zero
 * @return array
 */
public static function lastYear(): array
{
    $year = date('Y') - 1;
    return [
        mktime(0, 0, 0, 1, 1, $year),
        mktime(23, 59, 59, 12, 31, $year)
    ];
}
10.获取几天前零点到现在/昨日结束的时间戳
/**
 * 获取几天前零点到现在/昨日结束的时间戳
 *
 * @author zero
 * @param int $day 天数
 * @param bool $now 返回现在或者昨天结束时间戳
 * @return array
 */
public static function dayToNow(int $day = 1, bool $now = true): array
{
    $end = time();
    if (!$now) {
        list($foo, $end) = self::yesterday();
    }

    unset($foo);
    return [
        mktime(0, 0, 0, date('m'), date('d') - $day, date('Y')),
        $end
    ];
}
11.返回几天前的时间戳
 /**
 * 返回几天前的时间戳
 *
 * @author zero
 * @param int $day
 * @return int
 */
public static function daysAgo(int $day = 1): int
{
    $nowTime = time();
    return $nowTime - self::daysToSecond($day);
}
12.返回几天后的时间戳
/**
 * 返回几天后的时间戳
 *
 * @author zero
 * @param int $day
 * @return int
 */
public static function daysAfter(int $day = 1): int
{
    $nowTime = time();
    return $nowTime + self::daysToSecond($day);
}
13.天数转换成秒数
/**
 * 天数转换成秒数
 *
 * @author zero
 * @param int $day
 * @return int
 */
public static function daysToSecond(int $day = 1): int
{
    return intval($day * 86400);
}
14.周数转换成秒数
/**
 * 周数转换成秒数
 *
 * @author zero
 * @param int $week
 * @return int
 */
public static function weekToSecond(int $week = 1): int
{
    return intval(self::daysToSecond() * 7 * $week);
}
15.最近N天的日期
 /**
 * 最近N天的日期
 *
 * @author zero
 * @param int $day
 * @return array
 */
public static function nearToDate(int $day = 7): array
{
    $time = time();
    $date = [];
    for ($i=1; $i<=$day; $i++){
        $date[$i-1] = date('Y-m-d' ,strtotime( '+' . ($i - $day) .' days', $time));
    }
    return $date;
}
16.当前毫秒数
/**
 * 当前毫秒数
 *
 * @author zero
 * @return float
 */
public static function millisecond(): float
{
    list($mse, $sec) = explode(' ', microtime());
    return (float)sprintf('%.0f', (floatval($mse) + floatval($sec)) * 1000);
}
17.返回今天是周几
/**
 * 返回今天是周几
 *
 * @author zero
 * @return mixed
 */
public static function dayWeek(): string
{
    $week = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
    return $week[date('w')];
}
18.大写月份
/**
 * 大写月份
 *
 * @author zero
 * @param int $month
 * @return string
 */
public static function capMonth(int $month=0): string
{
    $month = $month > 0 ? $month : intval(date('m'));
    return match ($month) {
        1 => '一月',
        2 => '二月',
        3 => '三月',
        4 => '四月',
        5 => '五月',
        6 => '六月',
        7 => '七月',
        8 => '八月',
        9 => '九月',
        10 => '十月',
        11 => '十一月',
        12 => '十二月',
        default => '未知月份',
    };
}
19.格式化时间戳
/**
 * 格式化时间戳
 *
 * @param int $time
 * @return string
 */
public static function formatTime(int $time): string
{
    if ($time > 86400) {
        $days = intval($time / 86400);
        $hour = intval(($time - ($days * 86400)) / 3600);
        return $days.''.$hour.'';
    } else {
        $hour   = intval($time / 3600);
        $minute = intval(($time - ($hour * 3600)) / 60);
        return $hour.''.$minute.'';
    }