PHP遍历两个数组按相同account_id展示发票项如何避免重复
问题原因
你的代码使用了嵌套循环,每张发票都会遍历全部账户对象,因此每张发票会输出和账户数量一致的重复内容,同时原有调用getUsername/getCompany传参的逻辑也不符合对象方法的设计规范,账户自身的属性读取方法不需要传入外部参数。
解决方案
先将账户列表转换为以账户ID为键的映射表,遍历发票时直接通过account_id查找对应账户即可,不需要嵌套循环,时间复杂度也从O(n*m)降低到O(n+m):
<?php // 第一步:预处理账户为ID为键的映射表 $accountMap = []; foreach ($accounts as $account) { // 假设账户类提供getId()方法获取主键ID,没有的话替换为对应属性读取方式,比如$account->id $accountMap[$account->getId()] = $account; } // 第二步:遍历发票,直接查表取对应账户 foreach ($invoices as $invoice) { $accountId = $invoice->getAccountId(); // 校验对应账户是否存在,避免非法数据报错 if (!isset($accountMap[$accountId])) { continue; } $matchedAccount = $accountMap[$accountId]; // 输出账户信息 echo $matchedAccount->getUsername() . "<BR>"; echo $matchedAccount->getCompany() . "<BR>"; // 如果需要输出发票信息也可以在此处追加,例如: // echo '发票ID:' . $invoice->invoiceId . "<HR>"; }
内容的提问来源于stack exchange,提问作者Fabian
相关产品推荐
相关产品推荐

