<?php
/**
 * Link         :   http://www.phpcorner.net
 * User         :   qingbing<780042175@qq.com>
 * Date         :   2018-05-19
 * Version      :   1.0
 */

if (!function_exists("array_cover")) {
    /**
     * 覆盖模式的数组，最后一个数组可以为bool,而且为false时，表示不追加
     * @return array
     * @throws \Exception
     */
    function array_cover()
    {
        $args = func_get_args();
        $isAppend = array_pop($args);
        if (!is_bool($isAppend)) {
            array_push($args, $isAppend);
            $isAppend = true;
        }
        $count = count($args);
        if (0 === $count) {
            return [];
        }
        if (1 === $count) {
            return $args[0];
        }
        $R = array_shift($args);
        if (!is_array($R)) {
            throw new \Exception("覆盖源必须为数组", 100100101);
        }
        do {
            $c = array_shift($args);
            if (!is_array($c)) {
                throw new \Exception("覆盖数组参数必须为数组", 100100102);
            }
            if (!empty($c) && !$isAppend) {
                $c = array_intersect_key($c, $R);
            }
            if (!empty($c)) {
                $R = array_merge($R, $c);
            }
            if (empty($args)) {
                break;
            }
        } while (true);
        return $R;
    }
}

if (!function_exists("str_cover")) {
    /**
     * 用数组中的键值替换字符串中的对应的键名，并返回字符串
     * @param string $message
     * @param array $params
     * @return mixed
     */
    function str_cover($message, $params = [])
    {
        return str_replace(array_keys($params), $params, $message);
    }
}

if (!function_exists('str_eval')) {
    /**
     * 执行php的字符串代码
     * @param string $coding
     * @param bool $return
     * @return null|mixed
     */
    function str_eval($coding, $return = true)
    {
        if (!empty($coding)) {
            if ($return) {
                eval("\$R={$coding};");
                if (isset($R)) {
                    return $R;
                }
                return null;
            }
            eval("{$coding};");
        }
        return null;
    }
}

if (!function_exists("str_explode")) {
    /**
     * 通过分割符分割字符串成数组，并返回分割后数组（去除前后空格）
     * 如果不存在分隔符，将采用使用空格来进行拆分
     * @param string $str
     * @param string $delimiter
     * @return array[]|false|string[]
     */
    function str_explode($str, $delimiter = ',')
    {
        return preg_split("/[\s{$delimiter}]+/", $str, -1, PREG_SPLIT_NO_EMPTY);
    }
}

if (!function_exists("str_explode_by_upper")) {
    /**
     * 根据大写字母和给定的列表进行字符串拆分
     * @param string $str
     * @param array $delimiter
     * @return array
     */
    function str_explode_by_upper($str, $delimiter = [])
    {
        $r = preg_replace('/(?<![A-Z])[A-Z]/', 'P===F===P\0', $str);
        if (!empty($delimiter)) {
            $r = str_replace($delimiter, 'P===F===P', $r);
        }
        $sa = explode('P===F===P', $r);
        $R = [];
        foreach ($sa as $s) {
            if (empty($s)) {
                continue;
            }
            array_push($R, strtolower($s));
        }
        return $R;
    }
}

if (!function_exists("array_sort")) {
    /**
     * 数组排序（根据键递归升序）
     * @param array $array
     * @param bool $recursive
     * @return array
     */
    function array_sort($array = array(), $recursive = false)
    {
        ksort($array);
        if ($recursive) {
            foreach ($array as &$a) {
                if (is_array($a)) $a = array_sort($a, true);
            }
        }
        return $array;
    }
}