Krótko opisując temat. Mam sobie widok w którym matchuje sobie lewą stronę z prawą. Matchowanie może zachodzić jeden do jeden, wiele do jeden i wiele do wiele. I teraz przejdźmy do kodu:
Prawa strona ma większą wartość niż lewa:
$tickets = [ [ 'issue_id' => 'ZAKUPY-1070', 'amount' => '100' ], [ 'issue_id' => 'ZAKUPY-1043', 'amount' => '100' ] ]; $invoices = [ [ 'document_id' => '12998638134790357761.1', 'amount' => '150' ], [ 'document_id' => '12998638134790357761.2', 'amount' => '100' ] ]; $result = [ [ 'issue_id' => 'ZAKUPY-1070', 'document_id' => '12998638134790357761.1', 'issue_amount' => '100.0000', 'document_amount' => '100.0000' ], [ 'issue_id' => 'ZAKUPY-1043', 'document_id' => '12998638134790357761.1', 'issue_amount' => '50.0000', 'document_amount' => '50.0000' ], [ 'issue_id' => 'ZAKUPY-1070', 'document_id' => '12998638134790357761.2', 'issue_amount' => '0.0000', 'document_amount' => '0.0000' ], [ 'issue_id' => 'ZAKUPY-1043', 'document_id' => '12998638134790357761.2', 'issue_amount' => '50.0000', 'document_amount' => '50.0000' ] ];
Lewa strona ma większą wartość niż prawa:
$tickets = [ [ 'issue_id' => 'ZAKUPY-1070', 'amount' => '150' ], [ 'issue_id' => 'ZAKUPY-1043', 'amount' => '100' ] ]; $invoices = [ [ 'document_id' => '12998638134790357761.1', 'amount' => '100' ], [ 'document_id' => '12998638134790357761.2', 'amount' => '100' ] ]; $result = [ [ 'issue_id' => 'ZAKUPY-1070', 'document_id' => '12998638134790357761.1', 'issue_amount' => '100.0000', 'document_amount' => '100.0000' ], [ 'issue_id' => 'ZAKUPY-1043', 'document_id' => '12998638134790357761.1', 'issue_amount' => '0.0000', 'document_amount' => '0.0000' ], [ 'issue_id' => 'ZAKUPY-1070', 'document_id' => '12998638134790357761.2', 'issue_amount' => '50.0000', 'document_amount' => '50.0000' ], [ 'issue_id' => 'ZAKUPY-1043', 'document_id' => '12998638134790357761.2', 'issue_amount' => '50.0000', 'document_amount' => '50.0000' ] ];
Obie strony są równe:
$tickets = [ [ 'issue_id' => 'ZAKUPY-1070', 'amount' => '120' ], [ 'issue_id' => 'ZAKUPY-1043', 'amount' => '80' ] ]; $invoices = [ [ 'document_id' => '12998638134790357761.1', 'amount' => '80' ], [ 'document_id' => '12998638134790357761.2', 'amount' => '120' ] ]; $result = [ [ 'issue_id' => 'ZAKUPY-1070', 'document_id' => '12998638134790357761.1', 'issue_amount' => '80.0000', 'document_amount' => '80.0000' ], [ 'issue_id' => 'ZAKUPY-1043', 'document_id' => '12998638134790357761.1', 'issue_amount' => '0.0000', 'document_amount' => '0.0000' ], [ 'issue_id' => 'ZAKUPY-1070', 'document_id' => '12998638134790357761.2', 'issue_amount' => '40.0000', 'document_amount' => '40.0000' ], [ 'issue_id' => 'ZAKUPY-1043', 'document_id' => '12998638134790357761.2', 'issue_amount' => '80.0000', 'document_amount' => '80.0000' ] ];
Obecnie stanałem na rozwiązaniu:
$ticketsSummary = 0; foreach ($tickets as $ticket) { $baseTickets[$ticket['issue_id']] = $ticket; $ticketsSummary += $ticket['amount']; } $invoicesSummary = 0; foreach ($invoices as $invoice) { $baseInvoices[$invoice['document_id']] = $invoice; $invoicesSummary += $invoice['amount']; } foreach ($invoices as $invoice) { foreach ($tickets as $ticket) { $invoiceAmountCounter[$invoice['document_id']] = 0; } $invoiceAmountCounter[$invoice['document_id']] = $invoiceAmountCounter[$invoice['document_id']] + $ticket['amount']; if ($invoiceAmountCounter[$invoice['document_id']] >= $baseInvoices[$invoice['document_id']]['amount']) { $ticket['amount'] = $ticket['amount'] - ($invoiceAmountCounter[$invoice['document_id']] - $baseInvoices[$invoice['document_id']]['amount']); $ticket['amount'] = $ticket['amount'] < 0 ? 0 : $ticket['amount']; } $result[] = [ 'issue_id' => $ticket['issue_id'], 'document_id' => $invoice['document_id'], 'document_amount' => $ticket['amount'], 'issue_amount' => $ticket['amount'], ]; } }
Problem rozwiązany:
$right = $invoices; $rightColIndex = 0; $results = []; foreach ($tickets as $leftPos) { $ticketSum = 0; $rightPos = $right[$rightColIndex]; $ticketSum += $rightPos['amount']; $results[] = [ 'document_id' => $rightPos['document_id'], 'issue_id' => $leftPos['issue_id'], 'issue_amount' => $rightPos['amount'], 'document_amount' => $rightPos['amount'], ]; $rightColIndex++; } if ($ticketSum > $leftPos['amount']) { $rightColIndex--; $diffAmount = $ticketSum - $leftPos['amount']; $right[$rightColIndex]['amount'] = $diffAmount; } }