1

我正在尝试动态创建代表一周中 5 天的 5 个 div。在每个 div 中,我试图遍历从我的代码点火器模型中获取的数据,并根据与该项目相关的项目、日期和任务回显一系列无序列表。我正在从我的项目表中获取数据,以在 h4 标签中回显项目名称,并从任务表中获取数据,以回显项目 h4 下的相关任务。我遇到的问题是我似乎无法找到一种方法来防止我的算法重复项目名称和相关任务。换句话说,如果有两个任务与一个项目相关,则该项目和两个相关任务将被回显两次。这是帮助解释问题的图像:

在此处输入图像描述

    <?php for($counter = 0; $counter < 5; $counter++): ?><!-- loops through and creates divs -->
        <?php 
          $date = date("F j, Y");
          $refDate = date("Y-m-d");
          $counterForLi = 0;
        ?>
                  <div class="span2 check-list date-container">
                    <div id="form-to-date">
                      <div class="replace">

                      <h2 class="day"></h2>
                        <h4 class="thedate">
                          <?php
                            if ($counter > 0) {
                              $tomorrow = mktime(0, 0, 0, date("m"), date("d")+$counter, date("y"));
                              $refDate = date("Y-m-d", $tomorrow);
                              $date = date("F j, Y", $tomorrow);
                              echo $date;
                            } else {
                              echo $date;
                            }
                          ?>
                        </h4>
                        <input type="hidden" name="thedate" class="hidden-date" value="<?php echo $refDate; ?>">

                            <?php if(isset($tasks)) : foreach($tasks as $taskRow) :?> <!-- loop through the tasks -->
                              <?php if($taskRow->dateadded == $refDate) : ?> <!-- in the context of the right date -->
                                <?php if(isset($taskRow->_project_fk)) : ?>
                                    <?php
                                        $relatedProjectId = $taskRow->_project_fk;
                                        $relatedProjectName = NULL;
                                        if(!isset($relatedProjectName)) {
                                            foreach ($projects as $ProjectRow) {
                                                if ($ProjectRow->__project_pk == $relatedProjectId) {
                                                    $relatedProjectName = $ProjectRow->project_name;
                                                    echo "<h4>" . $relatedProjectName . "</h4>";
                                                echo "<ul>";
                                                }
                                            }

                                        foreach ($tasks as $task) {
                                          if ($task->_project_fk == $relatedProjectId && $task->dateadded == $refDate) {
                                            echo "<li>".$task->task_name."</li>";
                                          }

                                        }
                                        echo "</ul>";
                                    } 


                                    ?>

                                <?php endif; ?>

                              <?php endif; ?>

                            <?php endforeach; ?>

                            <?php endif; ?>

                          </ul>
                        </div><!-- /replace -->
                      </div><!-- /form-to-date -->
                    </div>
    <?php endfor; ?>

我意识到这段代码有点乱,所以如果你需要澄清,请询问。

编辑:这是我的任务数组的结构 在此处输入图像描述

4

1 回答 1

1

首先创建一个分层数组结构,按项目和日期对任务进行分组。从您的示例和数据结构看来,每个任务都属于一个项目并且是在一个日期开始的。对于每个日期,您希望显示在该日期开始至少有一个任务的每个项目以及在该日期开始的那些任务。

$tasksByProjectAndDate = array();
foreach ($tasks as $task) {
    $tasksByProjectAndDate[$task->dateadded][$task->_project_fk][] = $task;
}

接下来创建从项目 ID (PK) 到项目的映射。这使得查找每个项目的名称更快,因为您只循环所有项目一次。

$projectsById = array();
foreach ($projects as $project) {
    $projectsById[$project->__project_pk] = $project;
}

最后,您已准备好构建您的 UI。我将把它放入 HTML 中,由您决定,然后输出一个简单的文本视图。逻辑流程将是相同的。

foreach ($tasksByProjectAndDate as $date => $tasksByProject) {
    echo "$date\n";
    foreach ($tasksByProject as $projectId => $tasks) {
        $project = $projectsById[$projectId];
        echo "  $project->project_name\n";
        foreach ($tasks as $task) {
            echo "    $task->task_name\n";
        }
    }
}
于 2012-07-10T23:58:57.920 回答