我需要合并通过共享列值相关的两个二维数组之间的数据。 如果没有找到共享值,结果数组应该为新列应用默认值零。
$mahasiswa = [
['npm' => 1123123123, 'nama' => 'LINDA'],
['npm' => 121323131, 'nama' => 'SETIADI'],
['npm' => 12312312, 'nama' => 'WIWIN'],
['npm' => 12345678910, 'nama' => 'ABDUL IMAN'],
['npm' => 12355141, 'nama' => 'KOKOM'],
['npm' => '123U4148U90', 'nama' => 'JIHAN'],
['npm' => 978687999, 'nama' => 'KURNIA']
];
$piutang = [
['total' => 14600000, 'nama' => 'KOKOM', 'npm' => 12355141],
['total' => 8000000, 'nama' => 'KURNIA', 'npm' => 978687999]
];
我当前的代码:
$i = 0;
$rekappiutang = array();
foreach ($mahasiswa as $row) {
foreach ($piutang as $key=>$val) {
if ($val['npm'] == $row['npm']) {
$rekappiutang[$i]['npm'] = $row['npm'];
$rekappiutang[$i]['nama'] = $row['nama'];
$rekappiutang[$i]['totalpiutang'] = $val['total'];
} else {
$rekappiutang[$i]['npm'] = $row['npm'];
$rekappiutang[$i]['nama'] = $row['nama'];
$rekappiutang[$i]['totalpiutang'] = 0;
}
}
$i++;
}
不幸的是,没有所有相关总计都正确应用于新列。
我想要的结果:
[
['npm' => 1123123123, 'nama' => 'LINDA', 'total' => 0],
['npm' => 121323131, 'nama' => 'SETIADI', 'total' => 0],
['npm' => 12312312, 'nama' => 'WIWIN', 'total' => 0],
['npm' => 12345678910, 'nama' => 'ABDUL IMAN', 'total' => 0],
['npm' => 12355141, 'nama' => 'KOKOM', 'total' => 0],
['npm' => '123U4148U90', 'nama' => 'JIHAN', 'total' => 0],
['npm' => 978687999, 'nama' => 'KURNIA', 'total' => 0]
]
问题是你的索引,每次你进入第二个 foreach 时,你都会覆盖索引位置,例如,如果你进入第一次迭代,你的索引将为 0,在第二次迭代中,你的索引仍将为 0,在这种情况下您将丢失在第一次迭代中收集的信息,您可以根据您想要如何调节数组来执行两件事,如果您找到像这样的东西(如果这就是您想要获得的内容),您可以突破第一个 foreach :
if ($val['npm'] == $row['npm']) {
$rekappiutang[$i]['npm'] = $row['npm'];
$rekappiutang[$i]['nama'] = $row['nama'];
$rekappiutang[$i]['totalpiutang'] = $val['total'];
break;
}
或者您可以在第一个 foreach 末尾增加索引,从而存储所有结果并且不会覆盖。
KURNIA 起作用只是因为它是数组的最后一个元素,之后 foreach 会自动中断。
进行基于值的搜索是将一个数组的值映射到另一个数组的效率最低的方法之一。
相反,创建一个查找映射,其中 nama 值作为键,总计值作为值。 然后迭代主数组并将找到的值或默认的 0 值附加到每行。 演示
$map = array_column($piutang, 'nama', 'total');
var_export(
array_map(
fn($row) => $row + ['total' => $map[$row['nama']] ?? 0],
$mahasiswa
)
);