Pagina 1 van 1

PHP: geneste loops en lege entries verbergen

Geplaatst: 25 okt 2016, 23:12
door meon
Omdat ik niet dagdagelijks met (web)development bezig ben een klein 'logisch' vraagstuk waar ik me afvraag hoe de best practice is om dit uit te voeren.

Ik wil een overzicht van klanten, projecten en openstaande taken tonen. Een taak hoort bij een project, een project hoort bij een klant.
Ik doe hiervoor 3 API-calls naar de TrackingTime API; ik heb dus 3 objecten: eentje met alle $clients, eentje met $projects, eentje met $tasks .

Om dit overzicht te maken loop ik over alle $clients, daarbinnen loop ik over alle $projects waarbij $project->client->id == $client->id.
Hetzelfde doe ik daarbinnen met alle $tasks: lopen over $tasks waarbij $task->project_id == $project->id .

Nu zijn er bij het merendeel van die projects geen taken en vaak ook geen taken die nog open staan onder die clients.
Nu is m'n vraag: hoe kan ik zo'n project NIET tonen als er geen taken zijn, en bij uitbreiding ook de client NIET tonen als er geen tasks zijn?
Het probleem is dat ik pas 2 niveau's diep in de loops weet of er geen tasks zijn, maar op dat moment is de "header" met klantnaam wel al gerenderd?

Code: Selecteer alles

foreach ($clients->data as $client) { 
    echo "<h2>" . $client->name . "</h2>";
    foreach ($projects->data as $project) { 
        if ($project->customer->id == $client->id) {
            echo "<h4>" . $project->name . "</h4>";
            foreach ($tasks->data as $task) { 
                if ($task->project_id == $project->id) {
                    echo $task->name;
                }
            } 
        }
    } 
} 

Re: PHP: geneste loops en lege entries verbergen

Geplaatst: 26 okt 2016, 00:02
door w.l
Makkelijkste zonder al te veel code aan te moeten passen lijkt mij om eerst een string op te bouwen ipv direct te printen.

Zoiets dus:

Code: Selecteer alles

foreach ($clients->data as $client) { 
  $display_client = False;
  $client_string = "<h2>" . $client->name . "</h2>";
  foreach ($projects->data as $project) { 
     if ($project->customer->id == $client->id) {
        $display_project = False;
        $project_string = "<h4>" . $project->name . "</h4>";
        foreach ($tasks->data as $task) { 
           if ($task->project_id == $project->id) {
              $display_client = $display_project = True;
              $project_string .= $task->name;
           }
        }
        if ($display_project) {
          $client_string .= $project_string;
        } 
     }
   }
   if ($display_client) {
     echo $client_string;
   }
}