1

曜日を表す5つのdivを動的に作成しようとしています。各divで、コードイグナイターモデルからフェッチされたデータをループし、プロジェクト、日付、およびそのプロジェクトに関連するタスクに基づいて、一連の順序付けされていないリストをエコーし​​ようとしています。プロジェクトテーブルからデータをフェッチして、h4タグでプロジェクト名をエコーし​​、タスクテーブルから、プロジェクトh4の下で関連するタスクをエコーし​​ます。私が抱えている問題は、アルゴリズムがプロジェクト名と関連タスクを繰り返さないようにする方法が見つからないように見えることです。つまり、1つのプロジェクトに関連する2つのタスクがある場合、そのプロジェクトと2つの関連するタスクは2回エコーアウトされます。問題を説明するのに役立つ画像を次に示します。

ここに画像の説明を入力してください

    <?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

プロジェクトと日付でタスクをグループ化する階層配列構造を作成することから始めます。例とデータ構造から、各タスクは1つのプロジェクトに属し、1つの日付に開始されたように見えます。日付ごとに、その日に開始されたタスクが少なくとも1つある各プロジェクトと、その日に開始されたタスクを表示する必要があります。

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

次に、プロジェクトID(PK)からプロジェクトへのマップを作成します。これにより、すべてのプロジェクトを1回だけループするため、各プロジェクトの名前をすばやく検索できます。

$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 に答える