最近项目需求:

仿制某网站的菜单功能

效果如下:

效果大概就是这样啦。分析下吧:主要是分级查询我的思路:首先从数据库中查询所有的顶级目录:

目前就是这几个顶级目录在数据库中特点就是 父级id是0(一般都会有,在自己设计信息分类 类型网站时也应该注意设计该字段)

拿到顶级id以后,在数据库中查找父级id为这些id的数据,拿到次级id:

最后根据次级id 查找父级id为次级id的所有数据:

当然啦,你的数据库要有些数据,要不然就不好看了。这些数据拿到以后,会有专门的js代码引入这些数据然后展示(参考网站的做法是:将这些数据写入一个文件,js读取该文件。好处是减少数据库读写次数)

因此,我们也要学习这个写法,还可以顺便直接使用人家写好的js代码~~(嘿嘿嘿)

好,现在总结下工作:拿到三级数据->写入js文件->使用别人写好的js文件读取并显式(完美!!)

下面上代码。(自己写的不成熟的代码,欢迎提意见~!)

<?php
/*
* 读取 destoon_category 表 parentid 为0 的所有数据(顶级目录)
*
* 根据 parentid 查找 次级 id 最后根据次级id 查找 三级id
*
* 组合成一个数组 写入 js 文件 ( 方便前台获取)
*
* 顶级目录格式 : var QS_jobs_parent=new Array("169,广告|媒体|艺术|出版","1,销售|市场|客服|贸易");
* 目标目录格式 : var QS_jobs=new Array();
* QS_jobs[169]="170,广告|171,影视/媒体|172,艺术设计"; QS_jobs[顶级目录id]="次级id,次级标题|次级id,次级标题 "
* QS_jobs[170]="905,广告客户经理|906,广告客户专员"; QS_jobs[次级目录id]="三级id,三级标题|三级id,三级标题 "
*/
$toparr = select(0); getstring($toparr , 1); /*
* 读写文件操作
*
* 向文件追加内容
*/
function write($str){ $fp = fopen("../skin/default/job2/js/cache_classify.js" ,"a+" );
if($fp){
$w = fwrite($fp , "\r\n".$str);
if(!$w){
echo "写入失败";
}
}
fclose($fp);
} /*
* 数据库查询操作
*
* 传入 parentid
*/
function select($pid){
global $db; $A = array();//所有顶级目录 $query = "SELECT catid,catname FROM destoon_category WHERE parentid=".$pid; $arr = $db->query($query); while($r = $db->fetch_array($arr)) {
$A[] = $r;
}
return $A;
}
/*
* 获取2 3 级目录
*
* 传入数组 上级目录id
*
* 返回字符串数组
*/
function get23string($array){
for($a=0; $a<sizeof($array); $a++){
$str = 'QS_jobs['.$array[$a].']="'.getstring(select($array[$a]) , 2).'";'; write($str);
}
return $str;
}
/*
* 传入二维数组(顶级目录)
*
* 生成 顶级目录 文本 var QS_jobs_parent=new Array("169,广告|媒体|艺术|出版","1,销售|市场|客服|贸易");
*/
function getstring($arr ,$size){
$str = "";
$i = 0;
$arr2 = array();//顶级id 数组
$j = 0;
$arr3 = array();//次级id 数组
switch ($size){
case 1://生成顶级目录 文本
foreach ($arr as $Avalue){
foreach ($Avalue as $key=>$value){
if($key == 'catid'){
$arr2[$i]=$value;
$str .= '"'.$value.",";
}else{
$str .= $value.'"';
}
}
$i++;
sizeof($arr)>$i && $str .= ",";
}
$temp = 'var QS_jobs_parent = new Array('.$str.');';
$str = $temp;//顶级目录 文本
write($str);
write("var QS_jobs=new Array();");
//arr2 是顶级目录的 id
//根据顶级目录获取次级目录数组
get23string($arr2);
break;
case 2: // 生成二级目录文本
case 3: //生成三级目录文本
foreach ($arr as $Avalue){
foreach ($Avalue as $key=>$value){
if($key == 'catid'){
$arr3[$j] = $value;
$str .= $value.",";
}else{
$str .= $value."|";
}
}
$j++;
}
get23string($arr3);
//print_r($arr3);
//QS_jobs[169]="170,广告|171,影视/媒体|172,艺术设计"; QS_jobs[顶级目录id]="次级id,次级标题|次级id,次级标题 "
//$arr2 (顶级id)
return $str;
break;
default: break;
} return $str;
}
//var_dump($A); ?>

还有些注释,目标格式和最终实现效果:

另附别人写好的js代码:

/** 首页左侧职位类别下拉 */

jQuery.dropDownWidget = function (obj) {

    var c = $(obj).find(".job-sort-control"), l = $(obj).find(".job-sort-list"), lhtml = '';

    if (QS_jobs_parent) {

        $.each(QS_jobs_parent, function (index, val) {

            var dataValArr = splitData(val, ",");

            lhtml += '<div class="js-items" code="' + dataValArr[0] + '"><div class="js-level2 clearfix"><i class="level-icon icon' + (index + 1) + ' f-left"></i><span class="f-left">' + dataValArr[1] + '</span><i class="sort-arrow f-right"></i></div></div>';

        });

        l.html(lhtml);

    }
; var j = l.find('.js-items'), cwidth = $(obj).outerWidth(), cheight = l.outerHeight() + 14; j.last().addClass("js-items-last"); j.bind('mouseenter', function (event) { j.removeClass('js-items-nrb').removeClass('js-items-trb').addClass('js-items-rb'); var subclass = $(this).attr("code"); var html = '<div class="show">'; if (MakeLi(subclass)) { html += MakeLi(subclass); } html += '</div>'; $(this).addClass('js-items-nrb').next().addClass('js-items-trb'); $(".leftmenu_box").empty(); $(".leftmenu_box").append(html).css({
"top": "0",
"left": cwidth,
"display": "block",
"overflow": "auto",
"height": cheight
}); }); c.bind('click', function (event) { l.toggle(); }); $(obj).bind('mouseleave', function (event) { l.hide(); $(".leftmenu_box").hide(); j.removeClass('js-items-nrb').removeClass('js-items-trb').removeClass('js-items-rb'); }); function splitData(dataval, character) { if (dataval) {
return dataval.split(character)
}
; } function MakeLi(subclass) { if (!QS_jobs[subclass]) {
return "无"
}
; var liArray = QS_jobs[subclass].split("|"); var htmlstr = ''; if (liArray) { for (x in liArray) { if (liArray[x]) { var v = liArray[x].split(","); thirdclass = v[0]; htmlstr += '<div class="showbox"><div class="fl"><a target="_blank" title="' + v[1] + '" href="jobs/jobs-list.php?key=&jobcategory=' + subclass + '.' + v[0] + '.0">' + v[1] + '</a></div>'; if (thirdclass) { htmlstr += '<ul class="fr">'; htmlstr += Make_Third_Li(subclass, thirdclass); htmlstr += '</ul>'; } htmlstr += '<div class="clear"></div></div>'; } } } return htmlstr; } function Make_Third_Li(subclass, thirdclass) { if (!QS_jobs[thirdclass]) {
return "无"
}
; var tArray = QS_jobs[thirdclass].split("|"); var htmlstr1 = ''; if (tArray) { for (x1 in tArray) { if (tArray[x1]) { var v1 = tArray[x1].split(","); htmlstr1 += '<li><a target="_blank" title="' + v1[1] + '" href="jobs/jobs-list.php?key=&jobcategory=' + subclass + '.' + thirdclass + '.' + v1[0] + '">' + v1[1] + '</a></li>'; } } } return htmlstr1; } };

希望对你有用啊目标网站这里

上文代码优化:

/*
* 顶级目录格式 : var QS_jobs_parent=new Array("169,广告|媒体|艺术|出版","1,销售|市场|客服|贸易");
* 目标目录格式 : var QS_jobs=new Array();
* QS_jobs[169]="170,广告|171,影视/媒体|172,艺术设计"; QS_jobs[顶级目录id]="次级id,次级标题|次级id,次级标题 "
* QS_jobs[170]="905,广告客户经理|906,广告客户专员"; QS_jobs[次级目录id]="三级id,三级标题|三级id,三级标题 "
*/
function getjobs(){ global $db; $query = "select * from destoon_category where parentid=0"; $A = $db->_query($query);
$count = count($A);
foreach ($A as $ka => $a) {
//echo "顶级 ==>".$a['catid'].$a['catname']."\r\n";
$ka < ($count-1) ? $end = "," : $end = "";
$str .= "\"".$a['catid'].",".$a['catname']."\"".$end; $query = "select * from destoon_category where parentid=".$a['catid'];
$str2 .= 'QS_jobs['.$a['catid'].']='."\"";
$B = $db->_query($query);
$count2 = count($B);
foreach ($B as $kb => $b) {
//echo "次级 ====>".$b['catname']."\r\n";
$kb < ($count2-1) ? $end2 = "|" : $end2 = "";
$str2 .= $b['catid'].",".$b['catname'].$end2; $query = "select * from destoon_category where parentid=".$b['catid'];
$str3 .= 'QS_jobs['.$b['catid'].']='."\"";
$C = $db->_query($query);
$count3 = count($C);
foreach ($C as $kc => $c) {
//echo "三级 ======>".$c['catname']."\r\n";
$kc < ($count3-1) ? $end3 = "|" : $end3 = "";
$str3 .= $c['catid'].",".$c['catname'].$end3;
}
$str3 .="\"; \r\n";
}
$str2 .="\"; \r\n"; }
//$add = $str."\r\n";
$add = 'var QS_jobs_parent=new Array('.$str.');'."\r\n"; $add .= 'var QS_jobs=new Array();'."\r\n"; $add .= $str2.$str3; return $add;
// echo $add;
}

是不是看起来舒服多了

感谢大神写好的部分~

php 开发日常收获的更多相关文章

  1. 前端开发日常——CSS动画无限轮播

    近来没有什么值得写的东西,空闲的时候帮前端的同学做了些大屏上的展示模块,就放在这里写写吧,手把手"需求->设计-> 实现",受众偏新手向. 为了直观便于理解, 直接把结 ...

  2. ASP.NET MVC开发日常一:SessionID合理清除

    在MVC Web开发中临时存储数据一般会用到Session,Cookie,ViewBag,ViewData,TempData.每个的使用场景是不同,具体区别有空再补上. Session数据最敏感,最需 ...

  3. ReactJS的开发日常

    在用React框架开发的日子里,踩的坑真不少!今天就来说说这个关于组件的周期,说的可能不是很清楚,但是也给自己留下一个踩坑的纪念,如有不妥 还望大家指点一二 Warning: setState(... ...

  4. Android 开发日常积累

    Android 集合 Android 开源项目分类汇总 扔物线的 HenCoder 高级 Android 教程 hencoder HenCoder:给高级 Android 工程师的进阶手册 Andro ...

  5. 开发-日常工具:TFS(Team Foundation Server)

    ylbtech-开发-日常工具:TFS(Team Foundation Server) TFS(Team Foundation Server)是一个高可扩展.高可用.高性能.面向互联网服务的分布式文件 ...

  6. iOS开发日常笔记01

    为什么有initWithCoder还要awakeFromNib? awakeFromNib相较于initWithCoder的优势是:当awakeFromNib执行的时候,各种IBOutlet也都连接好 ...

  7. iOS开发 日常错误积累

    1.ios7 tableviewcell上面加入一个view,view上面有button,点击button不运行button的点击事件 解决的方法: self.view.userInteraction ...

  8. 前端开发-日常开发沉淀之git提交文件忽略

    .gitignore文件里添加需忽略的文件,或需要提交的文件 # Created by .ignore support plugin (hsz.mobi) ### VisualStudioCode t ...

  9. React Native 开发日常、常见问题总结及解决

    优点: 1.写 UI 快,跟写 HTML 差不多,flex 布局写起来很爽,而且跨平台: 2.调试方便,command + R 直接刷新 Simulator,不用像 Xcode 等待编译: 3.体验好 ...

  10. Android开发日常-listview滚动方法梳理

    listview滚动方法梳理 1.setSelection(position); 滚动到指定条目 2.setSelectionFromTop(position,y): 距离指定条目向下偏移y(像素) ...

随机推荐

  1. 机器学习策略篇:详解清除标注错误的数据(Cleaning up Incorrectly labeled data)

    清除标注错误的数据 监督学习问题的数据由输入\(x\)和输出标签 \(y\) 构成,如果观察一下的数据,并发现有些输出标签 \(y\) 是错的.的数据有些标签是错的,是否值得花时间去修正这些标签呢? ...

  2. Docker入门系列之四:Docker镜像

    在本文中,您将学习如何加快Docker构建周期并创建轻量级镜像.遵循之前的文章中的食物隐喻,我们将沙拉隐喻为Docker镜像,同时减少Docker镜像的数量. 在本系列的第3部分中,我们介绍了十几个D ...

  3. Kotlin 编程语言详解:特点、应用领域及语法教程

    什么是 Kotlin? Kotlin 是一种现代.流行的编程语言,由 JetBrains 在 2016 年发布. 自发布以来,它已经变得非常流行,因为它与 Java 兼容(Java 是目前最流行的编程 ...

  4. CAEmitterLayer动画的开始和结束

    有个需求,要求模仿微信做表情下雨的动画,一开始想用CAEmitterLayer,实现的代码如下: //期望:显示特效五秒后结束特效 UIImage *image = [UIImage imageNam ...

  5. Nacos + Gateway网关搭建微服务

    文章所有代码GtiHub:https://github.com/Tom-shushu/work-study 里面的gateway-server和server1项目 1.Docker 部署 Nacos ...

  6. 『vulnhub系列』Deathnote-1

    『vulnhub系列』Deathnote-1 下载地址: https://www.vulnhub.com/entry/deathnote-1,739/ 信息搜集: 使用nmap扫描存活主机,发现主机开 ...

  7. C# 判断字符串是否为整数

    /// <summary> /// 判断一个字符串是否是正整数 /// </summary> /// <param name="s"></ ...

  8. 第一节 线性数据结构 STL

    vector 容器 迭代器 vector<int> v{1, 0, 0, 8, 6}; for(vector<int>::interator it = v.begin(); i ...

  9. 使用 useLazyFetch 进行异步数据获取

    title: 使用 useLazyFetch 进行异步数据获取 date: 2024/7/20 updated: 2024/7/20 author: cmdragon excerpt: 摘要:&quo ...

  10. SQL Server 图解备份(完全备份、差异备份、增量备份)和还原

    常用的数据备份方式有完全备份.差异备份以及增量备份,那么这三种备份方式有什么区别,在具体应用中又该如何选择呢? 1.三种备份方式 完全备份(Full Backup):备份全部选中的文件夹,并不依赖文件 ...