PHP: geneste loops en lege entries verbergen

Gebruikersavatar
meon
Administrator
Administrator
Berichten: 15571
Lid geworden op: 18 Feb 2003
Twitter: meon
Locatie: Bree
Bedankt: 497 keer
Recent bedankt: 3 keer
Uitgedeelde bedankjes: 442 keer
Contact:

PHP: geneste loops en lege entries verbergen

Berichtdoor meon » 25 Okt 2016, 22:12

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: 11
Lid geworden op: 13 Jun 2011
Bedankt: 1 keer

Re: PHP: geneste loops en lege entries verbergen

Berichtdoor w.l » 25 Okt 2016, 23:02

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


Terug naar “Web-en applicatie-ontwikkeling”

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers en 1 gast