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;
}
}
}