Как использовать параллельный цикл? - PullRequest
0 голосов
/ 06 октября 2019

Я не совсем понимаю, как можно параллельно выводить два моих объекта. Это моя ситуация. В моей таблице contract он содержит parent_id (в каждом контракте может быть максимум один дочерний контракт), а затем в каждом контракте perk. Итак, я стремлюсь вывести это :

Old Contract Perks            Perks               New Contract Perks
1 ticket per year       Ticket Entitlement        2 ticket per year
30 days vacation        Vacation Entitlement      45 days vacation
...                     ...                       ...

, и это мой код:

PDF::writeHTMLCell(50, 0, $x, '', "Old Contract Perks", 1, 0, 1, true, 'C', true);
PDF::writeHTMLCell(50, 0, '', '', "Perks Name", 1, 0, 1, true, 'C', true);
PDF::writeHTMLCell(50, 0, '', '', "New Contract Perks", 1, 0, 1, true, 'C', true);
foreach ($this->contract->perks as $key => $perk) {
    foreach ($this->getParentContract($this->contract->parent_id)->perks as $parent_perk) {
        PDF::writeHTMLCell(50, 0, $x, '', $parent_perk->allotment, 1, 0, 1, true, 'C', true);
        PDF::writeHTMLCell(50, 0, '', '', $perk->perk_name, 1, 0, 1, true, 'C', true);
        PDF::writeHTMLCell(50, 0, '', '', $perk->allotment, 1, 1, 1, true, 'C', true);
    }
}

но мой выход при запуске выглядит так:

Old Contract Perks            Perks               New Contract Perks
1 ticket per year       Ticket Entitlement        2 ticket per year
30 days vacation        Vacation Entitlement      2 ticket per year
1 ticket per year       Ticket Entitlement        45 days vacation
30 days vacation        Vacation Entitlement      45 days vacation
...                     ...                       ...

1 Ответ

1 голос
/ 06 октября 2019

Предполагая, что родительский контракт имеет те же ключи, что и дочерний, вы можете использовать значение $key из child для доступа к соответствующему родительскому перку:

$parent_perks = $this->getParentContract($this->contract->parent_id)->perks;
foreach ($this->contract->perks as $key => $perk) {
    PDF::writeHTMLCell(50, 0, $x, '', $parent_perks[$key]->allotment, 1, 0, 1, true, 'C', true);
    PDF::writeHTMLCell(50, 0, '', '', $perk->perk_name, 1, 0, 1, true, 'C', true);
    PDF::writeHTMLCell(50, 0, '', '', $perk->allotment, 1, 1, 1, true, 'C', true);
}

Если контракты могут иметьразличное количество перков, вам нужно найти, какое из них имеет наибольшее количество перков, и использовать его для управления циклом:

$parent_perks = array_values($this->getParentContract($this->contract->parent_id)->perks);
$perks = array_values($this->contract->perks);
$count_perks = max(count($parent_perks), count($perks));
for ($i = 0; $i < $count_perks; $i++) {
    PDF::writeHTMLCell(50, 0, $x, '', $parent_perks[$i]->allotment ?? '', 1, 0, 1, true, 'C', true);
    PDF::writeHTMLCell(50, 0, '', '', $perks[$i]->perk_name ?? $parent_perks[$i]->perk_name, 1, 0, 1, true, 'C', true);
    PDF::writeHTMLCell(50, 0, '', '', $perks[$i]->allotment ?? '', 1, 1, 1, true, 'C', true);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...