基于PHP+Bootstrap的FAQ项目:实现文件夹驱动的动态列表需求
嘿,这个需求太实用了——让非技术人员不用碰代码就能更新FAQ,完美降低维护门槛。我来给你梳理一下怎么用PHP循环实现自动检测这些数字文件夹,动态生成对应的Bootstrap折叠面板:
核心思路
我们需要遍历指定目录下的数字命名文件夹,对每个合法的文件夹(包含question.txt和answer.txt),自动生成你原来写的那套Bootstrap accordion结构,全程不用手动添加单条FAQ代码。
完整实现代码
直接替换你原来的单条FAQ代码就行:
<div id="accordion" role="tablist"> <?php // 定义FAQ根目录(根据你的实际路径调整) $faqRootDir = '../faqs/professionals/eligibility-conditions/'; // 筛选出所有数字开头的文件夹(仅获取目录,排除文件) $faqFolders = glob($faqRootDir . '[0-9]*', GLOB_ONLYDIR); // 自然排序:保证1、2、10的顺序,而不是1、10、2 natsort($faqFolders); // 遍历每个FAQ文件夹 foreach ($faqFolders as $folder) { // 提取文件夹名(也就是FAQ的数字标识) $faqNumber = basename($folder); // 拼接对应的文件路径 $questionPath = $folder . '/question.txt'; $answerPath = $folder . '/answer.txt'; // 跳过缺失文件的文件夹,避免页面报错 if (!file_exists($questionPath) || !file_exists($answerPath)) { continue; } ?> <div class="card"> <div class="card-header d-flex w-100 justify-content-between" role="tab" id="heading<?php echo $faqNumber; ?>"> <h5 class="mb-0"> <a data-toggle="collapse" href="#collapse<?php echo $faqNumber; ?>" role="button" aria-expanded="false" aria-controls="collapse<?php echo $faqNumber; ?>"> <?php include($questionPath); ?> </a> </h5> <small><?php echo $faqNumber; ?></small> </div> <div id="collapse<?php echo $faqNumber; ?>" class="collapse" role="tabpanel" aria-labelledby="heading<?php echo $faqNumber; ?>" data-parent="#accordion"> <div class="card-body"> <div><p><?php include($answerPath); ?></p></div> </div> </div> </div> <?php } ?> </div>
关键细节说明
- 文件夹筛选:
glob()函数精准匹配数字开头的文件夹,如果你需要严格限制只能是纯数字文件夹,可以后续加正则验证$faqNumber,比如if (!ctype_digit($faqNumber)) continue;。 - 自然排序:
natsort()是核心,它能按照人类习惯的数字顺序排序,避免出现10排在2前面的尴尬情况。 - 容错处理:检查文件是否存在,防止更新者漏传
question.txt或answer.txt导致页面报错,直接跳过有问题的文件夹即可。 - 唯一ID生成:用FAQ的数字编号动态生成
headingX和collapseX,保证每个折叠面板的ID唯一,避免Bootstrap折叠功能冲突。
现在更新者只要在FTP的对应目录下新增数字命名的文件夹,里面放好question.txt和answer.txt,系统就会自动把它加到FAQ列表里,完全不用碰代码~
内容的提问来源于stack exchange,提问作者Samuel Chopard
相关产品推荐
相关产品推荐

