gpt4 book ai didi

php - 选择合适的算法来分配值的问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:54:59 24 4
gpt4 key购买 nike

我需要帮助来选择正确的算法来计算匹配。我有一个模块,可以在其中匹配票据和发票。可以将多张工单与多张发票匹配。

对于几个这样的基本演示,输入数据可能不同,对于所有这些,它应该以相同的方式匹配。以下是我应该得到的输入数据和结果的一些示例:

左边比右边大:

$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'
]
];

右边比左边大:

$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'
]
];

两边相等:

$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'
]
];

我这样试过:

$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) {
if (!isset($invoiceAmountCounter[$invoice['document_id']])) {
$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'],
];
}
}

但不幸的是,结果是不同的:(我热情地请求你在这件事上的帮助。

最佳答案

经过长时间的尝试,我得到了我想要的帮助:

$right = $invoices;
$rightColIndex = 0;
$results = [];

foreach ($tickets as $leftPos) {

$ticketSum = 0;

while (isset($right[$rightColIndex]) && $leftPos['amount'] > $ticketSum) {

$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'];


$results[count($results) - 1]['document_amount'] = $right[$rightColIndex]['amount'] - $diffAmount;
$results[count($results) - 1]['issue_amount'] = $right[$rightColIndex]['amount'] - $diffAmount;

$right[$rightColIndex]['amount'] = $diffAmount;

}
}

关于php - 选择合适的算法来分配值的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52713830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com