gistfile1.txt $data) { $refer[$data[$pk]] = $list[$key]; } foreach ($list as $key = $data) { // 判断是否存在parent $parentId = $data[$pid]; if ($root == $parentId) { $tree[] = $list[$key]; } else if(isset($refer[$parentId])){ is_objec
          
  $data) {
        $refer[$data[$pk]] =& $list[$key];
    }
    foreach ($list as $key => $data) {
        // 判断是否存在parent
        $parentId =  $data[$pid];
        if ($root == $parentId) {
            $tree[] =& $list[$key];
        } else if(isset($refer[$parentId])){
            is_object($refer[$parentId]) && $refer[$parentId] = $refer[$parentId]->toArray();
            
            $parent =& $refer[$parentId];
            $parent[$child][] =& $list[$key];
        }
    }
    
    return $tree;
}
/**
 * 分析数组及枚举类型配置值 格式 a:名称1,b:名称2
 * @return array
 */
function parse_config_attr($string)
{
    
    $array = preg_split('/[,;\r\n]+/', trim($string, ",;\r\n"));
    
    if (strpos($string, ':')) {
        
        $value = [];
        
        foreach ($array as $val) {
            
            list($k, $v) = explode(':', $val);
            
            $value[$k] = $v;
        }
        
    } else {
        
        $value = $array;
    }
    
    return $value;
}
/**
 * 解析数组配置
 */
function parse_config_array($name = '')
{
    
    return parse_config_attr(config($name));
}
/**
 * 获取单例对象
 */
function get_sington_object($object_name = '', $class = null)
{
    $request = \think\Request::instance();
    
    $request->__isset($object_name) ?: $request->bind($object_name, new $class());
    
    return $request->__get($object_name);
}
/**
 * 将二维数组数组按某个键提取出来组成新的索引数组
 */
function array_extract($array = [], $key = 'id')
{
    
    $count = count($array);
    
    $new_arr = [];
     
    for($i = 0; $i < $count; $i++) {
        
        if (!empty($array) && !empty($array[$i][$key])) {
            
            $new_arr[] = $array[$i][$key];
        }
    }
    
    return $new_arr;
}
/**
 * 根据某个字段获取关联数组
 */
function array_extract_map($array = [], $key = 'id'){
    
    
    $count = count($array);
    
    $new_arr = [];
     
    for($i = 0; $i < $count; $i++) {
        
        $new_arr[$array[$i][$key]] = $array[$i];
    }
    
    return $new_arr;
}
/**
 * 字符串转换为数组,主要用于把分隔符调整到第二个参数
 * @param  string $str  要分割的字符串
 * @param  string $glue 分割符
 * @return array
 */
function str2arr($str, $glue = ',')
{
    
    return explode($glue, $str);
}
/**
 * 数组转换为字符串,主要用于把分隔符调整到第二个参数
 * @param  array  $arr  要连接的数组
 * @param  string $glue 分割符
 * @return string
 */
function arr2str($arr, $glue = ',')
{
    
    return implode($glue, $arr);
}
/**
 * 获取目录下所有文件
 */
function file_list($path = '')
{
    
    $file = scandir($path);
    
    foreach ($file as $k => $v) {
        
        if (is_dir($path . SYS_DS_PROS . $v)) : unset($file[$k]); endif;
    }
    
    return array_values($file);
}
/**
 * 获取插件类的类名
 * @param strng $name 插件名
 */
function get_addon_class($name = '')
{
    
    $lower_name = strtolower($name);
    
    $class = SYS_ADDON_DIR_NAME. SYS_DS_CONS . $lower_name . SYS_DS_CONS . $name;
    
    return $class;
}
/**
 * 钩子
 */
function hook($tag = '', $params = [])
{
    
    \think\Hook::listen($tag, $params);
}
/**
 * 保存文件
 */
function sf($arr = [], $fpath = 'D:\test.php')
{
    
    $data = "
 ";
    
    file_put_contents($fpath, $data);
}
/**
 * 插件显示内容里生成访问插件的url
 * @param string $url url
 * @param array $param 参数
 * @author 麦当苗儿 
 
  
 */
function addons_url($url, $param = array())
{
    $parse_url  =  parse_url($url);
    $addons     =  $parse_url['scheme'];
    $controller =  $parse_url['host'];
    $action     =  $parse_url['path'];
    /* 基础参数 */
    $params_array = array(
        'addon_name'      => $addons,
        'controller_name' => $controller,
        'action_name'     => substr($action, 1),
    );
    $params = array_merge($params_array, $param); //添加额外参数
    
    return url('addon/execute', $params);
}
/**
 * 字符串命名风格转换
 * type 0 将Java风格转换为C的风格 1 将C风格转换为Java的风格
 * @param string $name 字符串
 * @param integer $type 转换类型
 * @return string
 */
function parse_name($name, $type=0)
{
    
    if ($type) {
        
        return ucfirst(preg_replace_callback('/_([a-zA-Z])/', function($match){return strtoupper($match[1]);}, $name));
    } else {
        
        return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_"));
    }
}
/**
 * 获取目录列表
 */
function get_dir($dir_name)
{
    
    $dir_array = [];
    
    if (false != ($handle = opendir($dir_name))) {
        
        $i = 0;
        
        while (false !== ($file = readdir($handle))) {
            
            if ($file != "." && $file != ".."&&!strpos($file,".")) {
                
                $dir_array[$i] = $file;
                
                $i++;
            }
        }
        
        closedir($handle);
    }
    
    return $dir_array;
}
/**
 * 获取缓存标签
 */
function get_cache_tag($name, $join = null)
{
    
    $table_string = strtolower($name);
    
    if (!empty($join)) {
        
        foreach ($join as $v) {
            
            $names = explode(' ', $v[0]);
            
            $table_name = str_replace('_', '', str_replace(SYS_DB_PREFIX, '', $names[0]));
            
            $table_string .= strtolower($table_name);
        }
    }
    
    $auto_cache_info = cache(AUTO_CACHE_KEY);
    
    empty($auto_cache_info[CACHE_TABLE_KEY][$table_string]) && $auto_cache_info[CACHE_TABLE_KEY][$table_string][CACHE_VERSION_KEY] = DATA_DISABLE;
    
    $auto_cache_info[CACHE_TABLE_KEY][$table_string][CACHE_LAST_GET_TIME_KEY] = TIME_NOW;
    
    cache(AUTO_CACHE_KEY, $auto_cache_info, DATA_DISABLE);
    
    return $table_string;
}
/**
 * 获取缓存key
 */
function get_cache_key($name, $where, $field, $order, $paginate, $join, $group, $limit, $data, $cache_tag)
{
    
    $auto_cache_info = cache(AUTO_CACHE_KEY);
    
    $version = '';
    
    if (!empty($join)) {
        
        foreach ($join as $v) {
            
            $names = explode(' ', $v[0]);
            
            $table_name = strtolower(str_replace('_', '', str_replace(SYS_DB_PREFIX, '', $names[0])));
            
            $version .= $auto_cache_info[CACHE_TABLE_KEY][$table_name][CACHE_VERSION_KEY];
        }
    } else {
        
        $version .= $auto_cache_info[CACHE_TABLE_KEY][strtolower($name)][CACHE_VERSION_KEY];
    }
    
    $param = request()->param();
    
    $key = md5(serialize(compact('name', 'where', 'field', 'order', 'paginate', 'join', 'group', 'limit', 'data', 'param', 'version')));
    
    $auto_cache = check_cache_key($key, $auto_cache_info, $cache_tag);
    
    cache(AUTO_CACHE_KEY, $auto_cache, DATA_DISABLE);
    
    return $key;
}
/**
 * 检查缓存key
 */
function check_cache_key($key = null, $auto_cache_info = null, $cache_tag = null)
{
    
    if (count($auto_cache_info[CACHE_CACHE_KEY]) >= $auto_cache_info[CACHE_MAX_NUMBER_KEY]) {
        
        unset($auto_cache_info[CACHE_CACHE_KEY][DATA_DISABLE]);
        
        $auto_cache_info[CACHE_CACHE_KEY] = array_values($auto_cache_info[CACHE_CACHE_KEY]);
    }
    
    if (!in_array($key, $auto_cache_info[CACHE_CACHE_KEY])) {
        
        $auto_cache_info[CACHE_CACHE_KEY][] = $key;
        
        isset($auto_cache_info[CACHE_TABLE_KEY][$cache_tag][CACHE_NUMBER_KEY]) ? $auto_cache_info[CACHE_TABLE_KEY][$cache_tag][CACHE_NUMBER_KEY]++ : $auto_cache_info[CACHE_TABLE_KEY][$cache_tag][CACHE_NUMBER_KEY] = DATA_NORMAL;
        isset($auto_cache_info[CACHE_NUMBER_KEY]) ? $auto_cache_info[CACHE_NUMBER_KEY]++ : $auto_cache_info[CACHE_NUMBER_KEY] = DATA_NORMAL;
    }
    
    return $auto_cache_info;
}
/**
 * 设置缓存版本
 */
function set_cache_version($name = '')
{
    $auto_cache_info = cache(AUTO_CACHE_KEY);
    
    $strtolower_name = strtolower($name);
            
    ++$auto_cache_info[CACHE_TABLE_KEY][$strtolower_name][CACHE_VERSION_KEY];
    
    cache(AUTO_CACHE_KEY, $auto_cache_info, DATA_DISABLE);
}
/**
 * 设置缓存统计数量
 */
function set_cache_statistics_number($key = '')
{
    $auto_cache_info = cache(AUTO_CACHE_KEY);
    
    !empty($key) && ++$auto_cache_info[$key];
    
    cache(AUTO_CACHE_KEY, $auto_cache_info, DATA_DISABLE);
}
/**
 * 获取图片url
 */
function get_picture_url($id = 0)
{
    
    $info = model('Picture')->where(['id' => $id])->field('path,url')->find();
    if (!empty($info['url']))  : return config('static_domain') . SYS_DS_PROS . $info['url'];  endif;
    if (!empty($info['path'])) : return '/upload/picture/'.$info['path'];  endif;
    return '/static/admin/img/onimg.png';
}
/**
 * 获取文件url
 */
function get_file_url($id = 0)
{
    
    $info = model('File')->where(['id' => $id])->field('path,url')->find();
    if (!empty($info['url']))  : return config('static_domain') . SYS_DS_PROS . $info['url'];  endif;
    if (!empty($info['path'])) : return '/upload/file/'.$info['path'];  endif;
    return '暂无文件';
}
/**
 * 导出excel信息
 * @param string  $titles    导出的表格标题
 * @param string  $keys      需要导出的键名
 * @param array   $data      需要导出的数据
 * @param string  $file_name 导出的文件名称
 */
function export_excel($titles = '', $keys = '', $data = [], $file_name = '导出文件' )
{
    
    $objPHPExcel = get_excel_obj($file_name);
        
    $y = 1;
    $s = 0;
    $titles_arr = str2arr($titles);
    foreach ($titles_arr as $k => $v) : $objPHPExcel->setActiveSheetIndex($s)->setCellValue(string_from_column_index($k). $y, $v); endforeach;
    $keys_arr = str2arr($keys);
    foreach ($data as $k => $v)
    {
        is_object($v) && $v = $v->toArray();
        
        foreach ($v as $kk => $vv)
        {
            
            $num = array_search($kk, $keys_arr);
            
            false !== $num && $objPHPExcel->setActiveSheetIndex($s)->setCellValue(string_from_column_index($num) . ($y + $k + 1), $vv );
        }
    }
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
    
    $objWriter->save('php://output'); exit;
}
/**
 * 获取excel
 */
function get_excel_obj($file_name = '导出文件')
{
    
    set_time_limit(0);
    vendor('phpoffice/phpexcel/Classes/PHPExcel');
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
    header("Content-Type:application/force-download");
    header("Content-Type:application/vnd.ms-execl");
    header("Content-Type:application/octet-stream");
    header("Content-Type:application/download");
    header('Content-Disposition:attachment;filename='.iconv("utf-8", "gb2312", $file_name).'.xlsx');
    header("Content-Transfer-Encoding:binary");
    
    return new PHPExcel();
}
/**
 * 数字转字母
 */
function  string_from_column_index($pColumnIndex = 0)
{
    static $_indexCache = [];
    
    if(!isset($_indexCache[$pColumnIndex]))
    {
        
        if($pColumnIndex < 26){
            
            $_indexCache[$pColumnIndex] = chr(65 + $pColumnIndex);
        }elseif($pColumnIndex < 702){
            
            $_indexCache[$pColumnIndex] = chr(64 + ($pColumnIndex / 26)).chr(65 + $pColumnIndex % 26);
        }else{
            
            $_indexCache[$pColumnIndex] = chr(64 + (($pColumnIndex - 26) / 676 )).chr(65 + ((($pColumnIndex - 26) % 676) / 26 )).  chr( 65 + $pColumnIndex % 26);
        }
    }
    
    return $_indexCache[$pColumnIndex];
}
/**
 * 页面数组提交后格式转换 
 */
function transform_array($array)
{
    $new_array = array();
    $key_array = array();
    foreach ($array as $key=>$val) {
        $key_array[] = $key;
    }
    $key_count = count($key_array);
    foreach ($array[$key_array[0]] as $i => $val) {
        
        $temp_array = array();
        for( $j=0;$j<$key_count;$j++ ){
            $key = $key_array[$j];
            $temp_array[$key] = $array[$key][$i];
        }
        $new_array[] = $temp_array;
    }
    return $new_array;
}
/**
 * 页面数组转换后的数组转json
 */
function transform_array_to_json($array)
{
    
    return json_encode(transform_array($array));
}
/**
 * 关联数组转索引数组
 */
function relevance_arr_to_index_arr($array)
{
    
    $new_array = [];
    
    foreach ($array as $v)
    {
        
        $temp_array = [];
        
        foreach ($v as $vv)
        {
            $temp_array[] = $vv;
        }
        
        $new_array[] = $temp_array;
    }
    
    return $new_array;
}
/**
 * 获取页面范围
 */
function get_page_number_scope($current_page = 0, $last_page = 0, $offset = 3, $page_number = 7)
{
    
    $init = DATA_SUCCESS;
    $max = $last_page;
    if($last_page > $page_number)
    {
        if($current_page <= $offset){
            $max    = $page_number;
        }else if($current_page + $offset >= $last_page){
            $init   = $last_page - $page_number + $init;
            $max    = $last_page;
        } else {
            $init   = $current_page - $offset;
            $max    = $current_page + $offset;
        }
    }
    
    return ['init' => $init, 'max' => $max];
}
/**
 * 获取分页HTML
 */
function get_page_html($current_page = 0, $last_page = 0, $offset = 3, $page_number = 7)
{
    
    $data = get_page_number_scope($current_page, $last_page, $offset, $page_number);
    $spans  = '';
    for($i = $data['init']; $i <= $data['max']; $i++) :  $spans .= $i == $current_page ? "
  ".$i."" : "
  $i"; endfor;
    $next   = '';
    $current_page_next = $current_page + DATA_SUCCESS;
    if ($current_page < $last_page) : $next =  "
  下一页"; endif;
    $prev = '';
    $current_page_prev = $current_page - DATA_SUCCESS;
    
    if ($current_page > DATA_SUCCESS) : $prev =  "
  上一页"; endif;
    $tmpl = "
   
   
     $prev $spans $next 
    
  ";
    
    return $tmpl;
}
// 获取访问token
function get_access_token()
{
    return md5('OneBase' . date("Ymd") . API_KEY);
}
/**
 * 格式化字节大小
 * @param  number $size      字节数
 * @param  string $delimiter 数字和单位分隔符
 * @return string            格式化后的带单位的大小
 * @author 麦当苗儿 
  
    */ function format_bytes($size, $delimiter = '') { $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB'); for ($i = 0; $size >= 1024 && $i < 5; $i++) : $size /= 1024; endfor; return round($size, 2) . $delimiter . $units[$i]; } /** * 时间戳格式化 * @param int $time * @return string 完整的时间显示 * @author huajie 
   
     */ function format_time($time = null, $format='Y-m-d H:i:s') { if (null === $time) : $time = TIME_NOW; endif; return date($format, intval($time)); } /** * 删除所有空目录 * @param String $path 目录路径 */ function rm_empty_dir($path) { if (!(is_dir($path) && ($handle = opendir($path))!==false)) : return false; endif; while(($file = readdir($handle))!==false) { if(!($file != '.' && $file != '..')) : continue; endif; $curfile = $path . SYS_DS_PROS . $file;// 当前目录 if(!is_dir($curfile)) : continue; endif; rm_empty_dir($curfile); if(count(scandir($curfile)) == 2) : rmdir($curfile); endif; } closedir($handle); } /** * 通过类创建逻辑闭包 */ function create_closure($class = null, $method_name = '', $parameter = []) { $func = function() use($class, $method_name, $parameter) { $object = get_sington_object($class, $class); return call_user_func_array([$object, $method_name], $parameter); }; return $func; } /** * 通过闭包列表控制事务 */ function closure_list_exe($list = []) { Db::startTrans(); try { foreach ($list as $closure) : $closure(); endforeach; Db::commit(); return true; } catch (\Exception $e) { Db::rollback(); throw $e; } } /** * 写入执行信息记录 */ function write_exe_log($begin = 'app_begin', $end = 'app_end', $type = 0) { $request = request(); $source_url = empty($_SERVER["HTTP_REFERER"]) ? '未知来源' : $_SERVER["HTTP_REFERER"]; $exe_log['ip'] = $request->ip(); $exe_log['exe_url'] = $request->url(); $exe_log['exe_time'] = number_format((float)debug($begin, $end), 6); $exe_log['exe_memory'] = number_format((float)debug($begin, $end, 'm'), 2); $exe_log['exe_os'] = get_os(); $exe_log['source_url'] = $source_url; $exe_log['session_id'] = session_id(); $exe_log['browser'] = browser_info(); $exe_log['status'] = DATA_NORMAL; $exe_log['create_time'] = TIME_NOW; $exe_log['update_time'] = TIME_NOW; $exe_log['type'] = $type; $exe_log['login_id'] = is_login(); $exe_log_path = "../runtime/log/exe_log.php"; file_exists($exe_log_path) && $now_contents = file_get_contents($exe_log_path); $arr = var_export($exe_log, true); empty($now_contents) ? $contents = "
     
    
   
  
        
        