获取数组中某个键的数值对应的个数
/**
* [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));
}