json($result); } } if (!function_exists('backJson')) { /** * @param $code * @param $message * @param string $data * @return array */ function backJson($code, $message, $data = ''): array { $flag = $code >= 0 && $code < 2000; return [ 'code' => $flag ? 0 : $code, 'error' => !$flag, 'msg' => $message, 'result' => $data, ]; } } ################################################### #### 商品相关的函数 ################################## ################################################### /** * 获取sku的价格区间 * * @param $relates * @return array */ if (!function_exists('getBetweenPrice')) { function getBetweenPrice($relates): array { $priceMin = 0; $priceMax = 0; $priceMarketMin = 0; $priceMarketMax = 0; $stockMin = 0; $stockMax = 0; foreach ($relates as $key => $row) { if ($key == 0) { $priceMin = $row['sku_price'] ?? 0; $priceMarketMin = $row['sku_market_price'] ?? 0; $stockMin = $row['sku_num'] ?? 0; } else { $priceMin = min($row['sku_price'] ?? 0, $priceMin); $priceMarketMin = min($row['sku_market_price'] ?? 0, $priceMarketMin); $stockMin = min($row['sku_num'] ?? 0, $stockMin); } $priceMax = max($row['sku_price'] ?? 0, $priceMax); $priceMarketMax = max($row['sku_market_price'] ?? 0, $priceMarketMax); $stockMax = max($row['sku_num'] ?? 0, $stockMax); } return [ 'priceMin' => $priceMin, 'priceMax' => $priceMax, 'priceMarketMin' => $priceMarketMin, 'priceMarketMax' => $priceMarketMax, 'stockMin' => $stockMin, 'stockMax' => $stockMax, ]; } } /** * 获取产品的价格,有sku,没有sku的 */ if (!function_exists('getPrice')) { function getPrice($item) { $price = $item['price']; $product_sku = $item['product_sku']; //如果存在sku,则根据sku计算价格 $sku = $item['sku']; if ($sku && $product_sku) { $product_sku = json_decode($product_sku, true); if (!empty($sku['spec'])) { $price = 0; $relateArr = $sku['relates'] ?? ''; if ($relateArr) { foreach ($relateArr as $row) { $idArr = $row['id']; if (empty(array_diff($product_sku, $idArr))) { $price = $row['sku_price']; break; } } } else { } } } return $price; } } /** * 获取库存数据 * * @param $item * @return int */ if (!function_exists('getStock')) { function getStock($item) { $stock = $item['stock']; $product_sku = $item['product_sku']; // 购买的sku //如果存在sku,则根据sku计算价格 $sku = $item['sku']; if ($sku && $product_sku) { $product_sku = json_decode($product_sku, true); if (!empty($sku['spec'])) { $stock = 0; $relateArr = $sku['relates'] ?? ''; if ($relateArr) { foreach ($relateArr as $row) { $idArr = $row['id']; if (empty(array_diff($product_sku, $idArr))) { $stock = $row['sku_num']; break; } } } } } return $stock; } } /** * 如果存在规格,获取规格的信息 */ if (!function_exists('getSpec')) { function getSpec($item) { $product_sku = $item['product_sku']; $sku = $item['sku']; $nameArr = []; if ($sku && $product_sku) { $product_sku = json_decode($product_sku, true); $specArr = $sku['spec'] ?? ''; foreach ($product_sku as $val) { if ($specArr) { foreach ($specArr as $row) { $children = $row['children']; foreach ($children as $item) { if ($item['pssv_id'] == $val) { $nameArr[] = $item['value']; } } } } } } return implode(';', $nameArr); } } /** * 随机生成订单号 * * @return string */ if (!function_exists('createNewOrderNo')) { function createNewOrderNo() { return date('ymd') . //180824 6位 substr(time(), -4) . //秒 4位 substr(microtime(), 2, 2) . //微妙2位 mt_rand(1111, 9999); //4位 } } if (!function_exists('getRealIp')) { function getRealIp() { if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) $ip = getenv("HTTP_CLIENT_IP"); else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) $ip = getenv("HTTP_X_FORWARDED_FOR"); else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) $ip = getenv("REMOTE_ADDR"); else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) $ip = $_SERVER['REMOTE_ADDR']; else $ip = "unknown"; return ($ip); } } if (!function_exists('arrToTree')) { /** * 递归实现无限极分类 * * @param $arr * @param $pid * @param array $config ['parent_id' => 'parent_id', 'id' => 'id', 'name' => 'name'] * @return array */ function arrToTree($arr, $pid = 0, $config = []) { static $tree = []; $key_parent_id = $config['parent_id'] ?? 'parent_id'; $key_id = $config['id'] ?? 'id'; $key_name = $config['name'] ?? 'name'; $step = $config['step'] ?? 0; foreach ($arr as $key => $val) { if ($val[$key_parent_id] == $pid) { $flg = str_repeat(" └―― ", $step); $val['name'] = $flg . $val[$key_name]; $tree[] = $val; $config['step'] = $step + 1; arrToTree($arr, $val[$key_id], $config); } } return $tree; } } if (!function_exists('generateToTree')) { /** * 引用算法 生成父子树结构 * * @param $array * @param $config ['parent_id' => 'parent_id', 'id' => 'id'] * @return array */ function generateToTree($array, $config = []) { $key_parent_id = $config['parent_id'] ?? 'parent_id'; $key_id = $config['id'] ?? 'id'; //第一步 构造数据 $items = array(); foreach ($array as $value) { $items[$value[$key_id]] = $value; } //第二部 遍历数据 生成树状结构 $tree = array(); foreach ($items as $key => $value) { if (isset($items[$value[$key_parent_id]])) { $items[$value[$key_parent_id]]['children'][] = &$items[$key]; } else { $tree[] = &$items[$key]; } } return $tree; } } if (!function_exists('getRandNumber')) { /** * 生成 12 位的随机码 * * @param int $num * @return bool|string */ function getRandNumber($num = 12) { return substr(md5(md5(microtime() . mt_rand()) . uniqid('', true)), mt_rand(0, 32 - $num), $num); } } /** * 判断是否是微信内部浏览器 * * @return bool */ if (!function_exists('isWeixin')) { function isWeixin() { if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) { return true; } return false; } } if (!function_exists('subtext')) { function subtext($text, $length) { if (mb_strlen($text, 'utf8') > $length) { return mb_substr($text, 0, $length, 'utf8') . '...'; } else { return $text; } } } if (!function_exists('getBonusOdds')) { /** * 根据概率,获取中奖编号 * * @param $proArr * @return int|string */ function getBonusOdds($proArr) { $result = ''; //概率数组的总概率精度 $proSum = array_sum($proArr); //概率数组循环 foreach ($proArr as $key => $proCur) { $randNum = mt_rand(1, $proSum); if ($randNum <= $proCur) { $result = $key; break; } else { $proSum -= $proCur; } } return $result; } } ################################################################################################### ################################################################################################### if (!function_exists('isMobile')) { function isMobile($mobile) { if (!is_numeric($mobile)) { return false; } return preg_match('#^13[\d]{9}$|^14[5,7]{1}\d{8}$|^15[^4]{1}\d{8}$|^16[\d]{9}$|^17[0,6,7,8]{1}\d{8}$|^18[\d]{9}$|^19[\d]{9}$#', $mobile) ? true : false; } } if (!function_exists('isEmail')) { /** * 验证email格式是否正确 * * @param $email * @return bool */ function isEmail($email) { $pattern = "/([a-z0-9]*[-_.]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[.][a-z]{2,3}([.][a-z]{2})?/i"; if (preg_match($pattern, $email)) { return true; } else { return false; } } } if (!function_exists('hidestr')) { /** * 将一个字符串部分字符用$re替代隐藏 * * @param string $string 待处理的字符串 * @param int $start 规定在字符串的何处开始, * 正数 - * 在字符串的指定位置开始 * 负数 - * 在从字符串结尾的指定位置开始 * 0 - * 在字符串中的第一个字符处开始 * @param int $length 可选。规定要隐藏的字符串长度。默认是直到字符串的结尾。 * 正数 - 从 start * 参数所在的位置隐藏 * 负数 - * 从字符串末端隐藏 * @param string $re 替代符 * @return string 处理后的字符串 */ function hidestr($string, $start = 0, $length = 0, $re = '*') { if (empty($string)) { return false; } $strarr = array(); $mb_strlen = mb_strlen($string); while ($mb_strlen) { //循环把字符串变为数组 $strarr[] = mb_substr($string, 0, 1, 'utf8'); $string = mb_substr($string, 1, $mb_strlen, 'utf8'); $mb_strlen = mb_strlen($string); } $strlen = count($strarr); $begin = $start >= 0 ? $start : ($strlen - abs($start)); $end = $last = $strlen - 1; if ($length > 0) { $end = $begin + $length - 1; } elseif ($length < 0) { $end -= abs($length); } for ($i = $begin; $i <= $end; $i++) { $strarr[$i] = $re; } if ($begin >= $end || $begin >= $last || $end > $last) { return false; } return implode('', $strarr); } } if (!function_exists('toRoute')) { /** * 例子 * toRoute('path/show'); # http://www.xx.com/currentBundle/path/show * * @param string $url * @param array $params * @param bool $scheme * @return string */ function toRoute($url = '', $params = [], $scheme = null) { return url($url, $params, $scheme); } } //////////////////////////////////////////////////////////////////////////////////// if (!function_exists('asset_link')) { /** * @param $url * @param string $version * @param string $urlName * @return string */ function asset_link($url, $version = '', $urlName = 'default') { return asset($url); } } if (!function_exists('asset_css')) { /** * @param $url * @param array $options * @param string $urlName * @return string */ function asset_css($url, $options = [], $urlName = 'default') { return ''; } } if (!function_exists('asset_js')) { /** * @param $url * @param array $options * @param string $urlName * @return string */ function asset_js($url, $options = [], $urlName = 'default') { return ''; } } if (!function_exists('asset_img')) { /** * @param $url * @param array $options * @param string $urlName * @return string */ function asset_img($url, $options = [], $urlName = 'default') { return ''; } } function route_info() { } function renderTagAttributes($attributes) { if (count($attributes) > 1) { $sorted = []; foreach ([ 'type', 'id', 'class', 'name', 'value', 'href', 'src', 'action', 'method', 'selected', 'checked', 'readonly', 'disabled', 'multiple', 'size', 'maxlength', 'width', 'height', 'rows', 'cols', 'alt', 'title', 'rel', 'media', ] as $name) { if (isset($attributes[$name])) { $sorted[$name] = $attributes[$name]; } } $attributes = array_merge($sorted, $attributes); } $html = ''; foreach ($attributes as $name => $value) { if (is_bool($value)) { if ($value) { $html .= " $name"; } } elseif (is_array($value)) { if ($name === 'class') { if (empty($value)) { continue; } $html .= " $name=\"" . htmlspecialchars(implode(' ', $value), ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8', true) . '"'; } elseif ($name === 'style') { if (empty($value)) { continue; } $result = ''; foreach ($value as $name2 => $value2) { $result .= "$name2: $value2; "; } $result = $result === '' ? null : rtrim($result); $html .= " $name=\"" . htmlspecialchars($result, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8', true) . '"'; } else { $html .= " $name='" . htmlspecialchars($value, JSON_UNESCAPED_UNICODE | JSON_HEX_QUOT | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS) . "'"; } } elseif ($value !== null) { $html .= " $name=\"" . htmlspecialchars($value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8', true) . '"'; } } return $html; } if (!function_exists('subtext')) { function subtext($text, $length) { if (mb_strlen($text, 'utf8') > $length) { return mb_substr($text, 0, $length, 'utf8') . '...'; } else { return $text; } } }