• 0
  • 0

PHP公用函数库

2019-12-09 823 0 admin 所属分类:PHP 记录

获取数组中某个键的数值对应的个数

/**
 * [filterby 过滤关联数组中某key某值  返回数组]
 *
 *
 * @param    [array]                   $array  [关联数组]
 * @param    [string]                   $value  [某个key的值 value]
 * @param    string                   $column [筛选的目标key]
 *
 * @return   [array]                           [description]
 */
function filterby($array, $value, $column = 'id') {
	return array_values(array_filter($array, function ($v) use ($column, $value) {
		return $v[$column] == $value;
	}));
}

function countby($array, $value, $column = 'id') {
	return count(filterby($array, $value, $column));
}
/**
 * 调用某个函数
 * PHP 会自动把闭包函数转换成内置类 Closure 的对象实例,依赖Closure 的对象实例又给闭包函数添加了更多的能力
 *
 * @param Closure|string $fn
 * @param mixed ...$args
 * @return mixed|null
 */
function call($fn = null, ...$args) {
	switch (true) {
    	case $fn instanceof Closure:
    	case is_string($fn) && function_exists($fn):
    		return $fn(...$args);
	}

	return null;
}
/**
 * 取得数组深度
 *
 * @param $array
 * @return int
 */
function array_depth($array) {
	$max_depth = 1;

	foreach ($array as $value) {
		if (is_array($value)) {
			$max_depth = array_depth($value) + 1;
		}
	}

	return $max_depth;
}
/**
 * 开启一个事务  支持层级嵌套 统一封装成一个事务处理
 * 用全局计数器记录调用transaction的次数 小于1则表示事务可以开始提交
 * @param Closure $fn
 * @return mixed
 */
function transaction($fn)
{
    global $_G;
    if ($_G['__IN_TRANSACTION__'] > 0) {
        $_G['__IN_TRANSACTION__']++;
    } else {
        $_G['__IN_TRANSACTION__'] = 1;
        query('set autocommit=0');
        query('begin');
    }

    $res = $fn();
    if (--$_G['__IN_TRANSACTION__'] < 1) {
        query('commit');
        query('set autocommit=1');
        unset($_G['__IN_TRANSACTION__']);
    }

    return $res;
}
/**
 * 从数组中筛选特定字段
 *
 * @param array $data 源数组
 * @param mixed $fields 筛选字段
 * @param int $level 处理级别
 * @return array
 */
function onlyfields(&$data, $fields) {

	if ($fields == '*') {
		return $data;
	}

	if (!is_array($data)) {
		return $data;
	}

	if (is_string($fields)) {
		$fields = explode(',', $fields);
	}

	if (!is_array($fields)) {
		$fields = (array) $fields;
	}

	foreach (array_keys($data) as $k) {
		if (!in_array($k, $fields)) {
			unset($data[$k]);
		}
	}
	return $data;
}
// 并发下 生成唯一订单号不重复
function generate_order_id() {
	$first = time() . mt_rand(100, 999);
	$second = substr(sha1(uniqid() . $first . inc('GOI', 100)), -4);
	$third = substr(sha1(uniqid() . $second . inc('GOI', 1000)), 0, 2);

	return strtoupper($first . $second . $third);
}

function inc($name, $increase) {
	static $_vars = [];

	if (!isset($_vars[$name])) {
		$_vars[$name] = 0;
	}
	return $_vars[$name] += $increase;
}

安全的用,号合并数值型字符串

/**
 * 联结数据中的 ID
 *
 * @param int|string|array $data
 * @param string $field
 * @return string
 */
function joinbyid($data, $field = 'id')
{
    return implode(',', splitbyid($data, $field));
}



/**
 * 分裂数据中的 ID
 *
 * @param int|string|array $data
 * @param string $field
 * @return array
 */
function splitbyid($data, $field = 'id')
{
    return array_filter(splitbyname($data, $field), 'is_numeric');
}

/**
 * 分裂数据中的 NAME
 *
 * @param int|string|array $data
 * @param string $field
 * @return array
 */
function splitbyname($data, $field = 'name')
{
    if (is_int($data)) {
        $data = [$data];
    } else if (is_string($data)) {
        $data = explode(',', $data);
    } else if (is_array($data) && array_depth($data) >= 2) {
        $data = array_column($data, $field);
    }

    return array_values(array_filter(array_unique($data), 'is_value'));
}


function is_value($var)
{
    return $var !== '' and $var !== null;
}

数组任意位置插入元素

/**
 * @param array      $array
 * @param int|string $position
 * @param mixed      $insert
 */
function array_insert(&$array, $position, $insert) {
	if (is_int($position)) {
		array_splice($array, $position, 0, $insert);
	} else {
		$pos = array_search($position, array_keys($array));
		$array = array_merge(array_slice($array, 0, $pos), $insert, array_slice($array, $pos));
	}
}

检查内容是否为整数

//检查目标值 是否为整数形式 is_int是判断变量类型是否为整数 如果是字符串返回false 
function check_int($data) {
	if (!is_numeric($data) ||  intval($data) - $data!=0) {
		return false;
	} else {
		return true;
	}
}

处理变量间简单的依赖关系

$depends = [
    'open_coupon_12'    => 'open_coupon,open_invite_friend',
    'open_coupon_12'    => 'open_coupon',
];

$messages = [
    'open_sign_first_money.open_sign'    => '要开启【首次签到送代金券】需先开启【签到功能】',
    'open_sign_coupon.open_sign'         => '要开启【签到送优惠券】需先开启【签到功能】',
];
$_POST[$k] && checkDepend($k, $depends, $messages);
function checkDepend($name, array $depends, array $messages) {
    $new_tasks = function($name) use($depends) {
        return array_map(function($v) use($name) {
            return ['name' = > $name, 'depend' = > $v];
        }, splitbyname($depends[$name]));
    };
    $tasks = $new_tasks($name);
    while ($tasks) {
        $cur = array_shift($tasks);
        if (isset($depends[$cur['depend']])) {
            $tasks = array_merge($new_tasks($cur['depend']), $tasks);
        }
        if (empty($_GET[$cur['depend']])) {
            fail($messages["{$cur['name']}.{$cur['depend']}"]);
        }
    }
}

获取统计的SWL语句 count

// 避免关联查询 造成过多的系统消耗
function getCountSql($sql) {
    // $sql = 'SELECT * FROM tk_orders o INNER JOIN tk_order_params p ON o.id = p.belong_order INNER JOIN tk_order_record r ON r.order_id=o.id WHERE 1 AND father_id = 10 AND `display_status` <>3 ORDER BY id DESC';
    if (!preg_match("/SELECT (.+?) FROM/i", $sql, $result)) {
        //不满足SQL 格式 直接返回
        return $sql;
    }
    if (trim($result[1]) == '*') {
        // 只是直接获取全部 改为 count 否则会加大查询时间
        $sql = preg_replace("/SELECT (.+?) FROM/i", "SELECT count(*) FROM", $sql);
    } else {
        $sql = preg_replace("/SELECT (.+?) FROM/i", "SELECT $1,count(*) FROM", $sql);
    }
    $data = [];
    // 检测是否有内联
    if (preg_match_all("/inner\s+join[0-9a-zA-Z\s\S]+?on/i", $sql, $data)) {
        //匹配出主表
        $result = [];
        if (preg_match("/FROM(.+?)inner\s+join/i", $sql, $result)) {
            $str = trim($result[1]);
            list($full_tablename, $shor_tablename) = parse_table_name($str);
        }
        //默认都是主表联结外表
        $flag = true;
        $outer_sql = $sql;
        foreach($data[0] as $k = > $v) {
            if (preg_match("/inner\s+join(.+?)on/i", $v, $result)) {
                //获取内联外表
                list($full_outside, $shor_outside) = parse_table_name(trim($result[1]));
            }
            // 匹配出关联条件
            if (preg_match("/{$v}\s+(.+?)((inner\s+join)|(left\s+join)|(right\s+join)|where)/i", $outer_sql, $result)) {
                if (stripos($result[1], "{$shor_tablename}.") === false) {
                    //链接了其他外表
                    $flag = false;
                    break;
                }
                // 检测当前表字段是否参与了 条件查询
                if (preg_match("/where(.+?)({$shor_outside}\.)/i", $outer_sql, $rs)) {
                    $flag = false;
                    break;
                }
                // 替换关联条件为空
                $outer_sql = str_replace([$v, $result[1]], "", $outer_sql);
            }
        }
        if ($flag) {
            $sql = preg_replace("/SELECT (.+?) FROM/i", "SELECT count(*) FROM", $outer_sql);
        }
    }
    // 如果有 limit 语句 删除
    if (($pos = stripos($sql, ' limit ')) !== false) {
        $sql = substr($sql, 0, $pos);
    }
    return $sql;
}

// 解析数据表 全称和简称
function parse_table_name($str) {
    $data = explode(" ", $str);
    $data = array_map(function($v) {
        return trim($v);
    }, $data);
    if ($data[0] && !$data[1]) {
        $data[1] = $data[0];
    }
    return $data;
}

文本数据 图片添加懒加载操作

function lazyload($html) {
   // 将图片标签选择出来 带上懒加载的属性
   // js  jQuery = $; $("img.lazy").lazyload();
   if (preg_match_all("/<img (.+?)>/i", $html,$data)){
      foreach ($data[0] as $k => $v) {
         $html = str_replace($v,preg_replace("/src=(.+?)\s/i", "data-original=$1 class=\"lazy\"", $v),$html);
      }
   }
   $html = str_replace("alt=\"undefined\"","",$html);
   return $html;
}

判断是否为微信环境

// 判断当前环境是否是微信环境
function isWeixin() {
	if (strpos($_SERVER['HTTP_USER_AGENT'], "MicroMessenger") !== false) {
		return true;
	} else {
		return false;
	}
}

判断是否为小程序环境

// 是否为微信环境 
function isMp() {
	if (strpos($_SERVER['HTTP_USER_AGENT'], "miniProgram") !== false) {
		return true;
	} else {
		return false;
	}
}

自定义不四舍五入 取小数点后指定精度

function my_round($data,$decial=1) {
	return substr(sprintf('%.10f',$data), 0,-(10-$decial));
}


返回顶部