PHP循环取决于文件夹的数量

时间:2018-01-23 11:40:59

标签: php loops templates include

我正在开发一个项目,这是一种用HTML和PHP(基于Bootstrap)制作的常见问题解答。

一些HTML / PHP知识有限的人需要定期更新它,所以我决定使用PHP中的“include”功能来调用一些.txt文件。然后,将更新它的人只需要修改简单的.txt文件,这不需要任何编码知识。

文本文件存储在faq / main-category / sub-category / 1 / question.txt中,与“answer.php”相同(均在同一文件夹中)。

常见问题项目用数字标识(您可以在下面的屏幕截图中看到)。这些数字指的是文件所在的目录(上面的.txt文件路径中的“1”)。

Screenshot of list of FAQ items

现在,问题是:我想允许修改它的人轻松添加一些新的FAQ项目。他们的想法是只需要在FTP服务器上创建一个新文件夹(比方说“4”),它就会自动列在常见问题解答中。

为此,我需要插件检测FTP服务器中的所有项目并列出所有项目。我相信循环是可能的,但是,我不知道如何......

任何人都可以帮忙吗?任何帮助将不胜感激! :)

以下是截图中第一个FAQ项目的当前代码:

<div id="accordion" role="tablist">
  <div class="card">
    <div class="card-header d-flex w-100 justify-content-between" role="tab" id="headingOne">
      <h5 class="mb-0">
        <a data-toggle="collapse" href="#collapseOne" role="button" aria-expanded="true" aria-controls="collapseOne">
          <?php include('../faqs/professionals/eligibility-conditions/1/question.txt'); ?>
        </a>
      </h5>
      <small>1</small>
    </div>
    <div id="collapseOne" class="collapse" role="tabpanel" aria-labelledby="headingOne" data-parent="#accordion">
      <div class="card-body">
        <div><p><?php include('../faqs/professionals/eligibility-conditions/1/answer.txt'); ?></p></div>
    </div>
  </div>
 </div> 

您将看到两个“包含”代码,用于调用问题和答案的.txt文件。

Here is a screenshot of the file path

2 个答案:

答案 0 :(得分:0)

<?php
foreach (glob("../faqs/professionals/eligibility-conditions/*",GLOB_ONLYDIR) as $foldername) {
?>
  <div id="accordion" role="tablist">
   <div class="card">
    <div class="card-header d-flex w-100 justify-content-between" role="tab" id="headingOne">
      <h5 class="mb-0">
        <a data-toggle="collapse" href="#collapseOne" role="button" aria-expanded="true" aria-controls="collapseOne">
          <?php include($foldername.'/question.txt'); ?>
        </a>
      </h5>
      <small>1</small>
    </div>
    <div id="collapseOne" class="collapse" role="tabpanel" aria-labelledby="headingOne" data-parent="#accordion">
      <div class="card-body">
        <div><p><?php include($foldername.'/answer.txt'); ?></p></div>
    </div>
  </div>
 </div> 
<?php
}
?>

答案 1 :(得分:0)

我不确定你的应用程序结构是什么,也许你正在使用MVC架构,但你可以像下面这样做。

创建一个PHP函数,它将返回一个带有问题和答案的数组

<?php
function get_faqs(){
    $folderpath = 'faqs/shared/'; //change as per your desired path
    if(scandir($folderpath)){
        $file_arr = scandir($folderpath);
        foreach ($file_arr as $val){
            if($val == '.' || $val == '..'){ 
                continue; 
            } else if(scandir($folderpath.$val)){           
                $faq_arr = scandir($folderpath.$val);
                foreach ($faq_arr as $file){
                    if($file == '.' || $file == '..'){ 
                        continue; 
                    } else if($file == 'question.txt'){
                        $faq_final[$val]['question'] = file_get_contents($folderpath.$val.'/'.$file);
                    } else if($file == 'answer.txt'){
                        $faq_final[$val]['answer'] = file_get_contents($folderpath.$val.'/'.$file);
                    }
                }
            }
        }
    }
    return $faq_final;
}
?>

然后在HTML中迭代该数组,如下所示

<?php
$faqs = get_faqs(); // you need to call this in controller if you have MVC application
?>
<div id="accordion" role="tablist">
<?php foreach ($faqs as $num => $data) { ?>
    <div class="card">
        <div class="card-header d-flex w-100 justify-content-between" role="tab" id="headingOne">
            <h5 class="mb-0">
                <a data-toggle="collapse" href="#collapseOne" role="button" aria-expanded="true" aria-controls="collapseOne">
                    <?php echo $data['question']; ?>
                </a>
            </h5>
            <small><?php echo $num; ?></small>
        </div>
        <div id="collapseOne" class="collapse" role="tabpanel" aria-labelledby="headingOne" data-parent="#accordion">
            <div class="card-body">
                <div><p><?php echo $data['answer']; ?></p></div>
            </div>
        </div>
    </div>
<?php } ?>
</div>