数组分组 按一个key值分组 二维数组
/**
* 数组分组 按一个key值分组 二维数组
* @param $arr 分组的数组
* @param $key 分组的key值
* @return array
*/
function array_group_by($arr, $key)
{
$grouped = [];
foreach ($arr as $value) {
$grouped[$value[$key]][] = $value;
}
if (func_num_args() > 2) {
$args = func_get_args();
foreach ($grouped as $key => $value) {
$params = array_merge([$value], array_slice($args, 2, func_num_args()));
$grouped[$key] = call_user_func_array('array_group_by', $params);
}
}
return $grouped;
}
无限递归分类树
/**
* 无限递归分类树
* @request post
* @param $data 数组数据
* @param $pId 初始 父id
* @return array|string
*/
function _getTree($data, $pId = 0)
{
$tree = '';
foreach ($data as $k => $v) {
if ($v['pid'] == $pId) { //父亲找到儿子
$v['children'] = $this->_getTree($data, $v['id']);
if ($v['children'] == "") {
unset($v['children']);
}
$tree[] = $v;
}
}
return $tree;
}
数组去除空值
/**
* 数组去除空值
* @param $arr
* @param bool $trim
* @return string
*/
function array_remove_empty(&$arr, $trim = true)
{
if (!is_array($arr)) return false;
foreach ($arr as $key => $value) {
if (is_array($value)) {
self::array_remove_empty($arr[$key]);
} else {
$value = ($trim == true) ? trim($value) : $value;
if ($value == "") {
unset($arr[$key]);
} else {
$arr[$key] = $value;
}
}
}
}
约瑟夫游戏
/**
* 约瑟夫游戏
* @param $arr 游戏总人数
* @param $number 淘汰的数字
* @param $i 开始数字
* @param $unset_number 淘汰人数
* @param array $arr_unset 淘汰的人集合
* @return array 返回淘汰人数
*/
function _josephGame($arr,$number,$i,$unset_number,$arr_unset = [])
{
//$n 记录当前循环次数
$n = 0;
//$arr_count 当前还在游戏内的人数
$arr_count = count($arr);
foreach ($arr as $k => $v){
//循环次数 +1
$n++;
// 判断是否数到了需要淘汰的数字(默认数字9)
if($i == $number){
//统计淘汰的人
$arr_unset[] = $arr[$k];
//删除淘汰的人
unset($arr[$k]);
//判断是否达到了淘汰人数(默认15人)
if(count($arr_unset) >= $unset_number) break;
//数字到9了之后 重新开始计数
$i = 0;
}
//数字默认 +1
$i++;
//判断是否已经已经走完了一轮 走完了重新开始
if($arr_count == $n) $this->_josephGame($arr,$number,$i,$unset_number,$arr_unset);
}
return $arr_unset;
}
秒数转换时间
/**
* 秒数转换时间
* @param $seconds 秒数
* @return string 时间
*/
function changeTimeType($seconds){
if ($seconds>3600){
$hours = intval($seconds/3600);
$time = $hours."时".gmstrftime('%M', $seconds).'分'.gmstrftime('%S', $seconds).'秒';
}else{
$time = gmstrftime('%H', $seconds).'时'.gmstrftime('%M', $seconds).'分'.gmstrftime('%S', $seconds).'秒';
}
return $time;
}
curl模拟请求数据
/**
* @param $url 请求地址
* @param array $data 请求数据
* @param bool $post 是否为post
* @param bool $https 是否为https请求
* @return bool|string 返回请求数据
*/
function http_curl($url, $data = [], $post = false, $https = true )
{
//创建一个新CURL资源 返回一个CURL句柄,出错返回 FALSE。
$curl = curl_init();
//构造来源
curl_setopt($curl, CURLOPT_REFERER, $_SERVER['HTTP_HOST']);
//模拟用户使用的浏览器
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
//在发起连接前等待的时间,如果设置为0,则无限等待。
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 300);
//设置CURL允许执行的最长秒数
curl_setopt($curl, CURLOPT_TIMEOUT, 300);
//获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
//设置为https请求,不验证证书和hosts
if ($https) {
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
}
//用来设置HTTP头字段的数组
$header[] = 'ContentType:application/json;charset=UTF-8';
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
//设置请求地址
curl_setopt($curl, CURLOPT_URL, $url);
if($post){
//发送POST请求
curl_setopt($curl, CURLOPT_POST, true);
//发送的POST数据
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
//启用时追踪句柄的请求字符串
curl_setopt($curl, CURLINFO_HEADER_OUT, TRUE);
//执行CURL
$result = curl_exec($curl);
//检查是否有错误发生
if (curl_errno($curl)) {
//返回最后一次的错误号
return curl_error($curl);
}
//关闭CURL 并且释放系统资源
curl_close($curl);
return $result;
}
将返回数据格式都变为字符串
/**
* 将返回数据格式都变为字符串
* @param $arr
* @return array
*/
function attrToString($arr)
{
if (!is_array($arr) || empty($arr)) return $arr;
foreach ($arr as $k=>$v){
if(is_array($v) && !empty($v) ){
$arr[$k] = attrToString($v);
}else{
$arr[$k] = is_numeric($v) ? (string)$v : $v;
}
}
return $arr;
}
去除数组数据中的左右空格
/**
* 去除数组数据中的左右空格
* @param $param
* @return array
*/
function paramToTrim($param)
{
if (!is_array($param)) return trim($param);
foreach ($param as $k=>$v){
if(is_array($v)){
$param[$k] = paramToTrim($v);
}else{
$param[$k] = trim($v);
}
}
return $param;
}
生成订单号(不隐藏生成时间)
/**
* 生成订单号(不隐藏生成时间)
*/
function generate_order_number_also(){
return
date('YmdHis') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
}
生成订单号(隐藏生成时间)
/**
* 生成订单号(隐藏生成时间)
*/
function generate_order_number(){
list($millisecond, $date) = explode(' ', microtime());
$time = (float)sprintf('%.0f', (floatval($millisecond) + floatval($date)) * 1000);
$order_code = strtoupper(substr(md5($time), 8, 16)) . str_pad(mt_rand(1, 99), 2, '0', STR_PAD_LEFT);
return $order_code;
}
前后端分离返回数据(解决跨域)
/**
* 前后端分离返回数据
* @param $code 状态码
* @param $msg 提示信息
* @param array $data 返回数据
*/
function _ajaxReturn($code, $msg, $data=array())
{
$data = is_null($data) ? array() : $data;
$data = array(
"code" => (int)$code,
"msg" => $msg,
"data" => $data
);
header('Cache-Control:no-cache,must-revalidate');
header('Pragma:no-cache');
header('Content-Type:application/json; charset=utf-8');
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers:x-requested-with,content-type");
exit(json_encode($data));
}
检验时间是否为有效时间
/**
* 验证日期是否有效
* @param $date
* @return bool|false|string
*/
public static function checkDateIsValid($date)
{
if ( !preg_match("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/" , $date , $parts)) {
return false;
} else {
//检测是否为日期
if (checkdate($parts[2] , $parts[3] , $parts[1])) {
$isDate = strtotime($date) ? strtotime($date) : false;
if ($isDate === false) {
return false;
} else {
return date('Y-m-d' , $isDate);
}
} else {
return false;
}
}
}
去除昵称中的表情(可配合去重空格使用)
/**
* 去除昵称中的表情
* @param $str 字符串
* */
function filter_emoji($str)
{
$str = preg_replace_callback( //执行一个正则表达式搜索并且使用一个回调进行替换
'/./u' ,
function (array $match) {
return strlen($match[0]) >= 4 ? '' : $match[0];
} ,
$str);
return $str;
}