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 = "
