• 0
  • 0

PHP公用函数库

2019-12-09 73 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']}"]);
        }
    }
}


返回顶部