PHP: geneste loops en lege entries verbergen

Alles over programmeren en development binnen de IT-wereld
Plaats reactie
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16729
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 574 keer
Bedankt: 770 keer

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;
                }
            } 
        }
    } 
} 
w.l
Starter
Starter
Berichten: 12
Lid geworden op: 13 jun 2011, 23:01
Bedankt: 1 keer

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;
   }
}
Plaats reactie

Terug naar “Development”