PHP按年份键匹配合并两个多维数组生成指定结构输出HTML表格
PHP按年份合并两个多维数组实现方案
现有两个按年份存储条目的数组 $brochures 和 $brochures_so,需要按年份匹配合并条目,生成指定结构的 $peilingen 数组,最终输出对应HTML表格。
原始数组结构示例
$brochures 数组结构
array(20) { [0]=> array(1) { [2022]=> array(1) { ["brochure"]=> array(1) { ["vakgebied"]=> string(4) "test" } } } [1]=> array(1) { [2021]=> array(1) { ["brochure"]=> array(1) { ["vakgebied"]=> string(8) "Wiskunde" } } } [2]=> array(1) { [2021]=> array(1) { ["brochure"]=> array(1) { ["vakgebied"]=> string(43) "Informatieverwerving en -verwerking met ICT" } } } }
$brochures_so 数组结构
array(22) { [0]=> array(1) { [2022]=> array(1) { ["brochure_so"]=> array(2) { ["vakgebied"]=> string(8) "Wiskunde" ["onderwijsniveau"]=> string(25) "1ste graad a- en b-stroom" } } } [1]=> array(1) { [2022]=> array(1) { ["brochure_so"]=> array(2) { ["vakgebied"]=> string(10) "Nederlands" ["onderwijsniveau"]=> string(25) "1ste graad a- en b-stroom" } } } [2]=> array(1) { [2021]=> array(1) { ["brochure_so"]=> array(2) { ["vakgebied"]=> string(3) "PAV" ["onderwijsniveau"]=> string(13) "3de graad bso" } } } [3]=> array(1) { [2021]=> array(1) { ["brochure_so"]=> array(2) { ["vakgebied"]=> string(35) "Kritisch denken & mediawijsheid" ["onderwijsniveau"]=> string(9) "3e graad " } } } }
目标要求
目标数组 $peilingen 结构
/* 目标多维数组结构 */ $peilingen = [ [2022 => ["brochure_so" => ["vakgebied" => "Wiskunde", "onderwijsniveau" => "1ste graad a- en b-stroom"], "brochure" => ["vakgebied" => ""]]], [2022 => ["brochure_so" => ["vakgebied" => "Nederlands", "onderwijsniveau" => "1ste graad a- en b-stroom"], "brochure" => ["vakgebied" => ""]]], [2021 => ["brochure_so" => ["vakgebied" => "PAV", "onderwijsniveau" => "3de graad bso"], "brochure" => ["vakgebied" => "Wiskunde"]]], [2021 => ["brochure_so" => ["vakgebied" => "Kritisch denken & mediawijsheid", "onderwijsniveau" => "3de graad bso"], "brochure" => ["vakgebied" => "Informatieverwerving en -verwerking met ICT"]]], ];
合并规则
- 相同年份的条目按原有顺序匹配合并
- 同一年份下两个数组条目数量不一致时,无匹配条目的对应字段留空
- 例:2022年
$brochures有1条数据,$brochures_so有2条数据,则第二条$brochure_so条目对应的brochure字段留空
最终输出表格效果
| Jaar | Brochure_so | Brochure |
|---|---|---|
| 2022 | Wiskunde - 1ste graad a- en b-stroom | Test |
| 2022 | Nederlands - 1ste graad a- en b-stroom | |
| 2021 | PAV - 3de graad bso | Wiskunde |
| 2021 | Kritisch denken & mediawijsheid - 3de graad bso |
表格渲染参考代码:
echo "<table><thead><tr><th>Jaar</th><th>Brochure</th><th>Brochure_so</th></tr></thead><tbody>"; foreach ($peilingen as $peiling) { foreach ($peiling as $jaar => $peil) { echo "<tr><td>" . $jaar . "</td>"; echo "<td>" . $peil["brochure"]["vakgebied"] . "</td>"; echo "<td>" . $peil["brochure_so"]["vakgebied"] . " | " . $peil["brochure_so"]["onderwijsniveau"] . "</td>"; echo "</tr>"; } } echo "</tbody></table>";
实现代码
先按年份分组整理两个数组的条目,再遍历年份按顺序拼接条目,自动补全缺失字段:
// 1. 按年份分组整理两个数组的条目 $groupedBrochures = []; foreach ($brochures as $item) { $year = array_key_first($item); $groupedBrochures[$year][] = $item[$year]['brochure']; } $groupedBrochuresSo = []; foreach ($brochures_so as $item) { $year = array_key_first($item); $groupedBrochuresSo[$year][] = $item[$year]['brochure_so']; } // 2. 获取所有存在的年份,按倒序(最新年份在前)排序,需要正序可将rsort改为sort $allYears = array_unique(array_merge(array_keys($groupedBrochures), array_keys($groupedBrochuresSo))); rsort($allYears); // 3. 拼接生成目标$peilingen数组 $peilingen = []; foreach ($allYears as $year) { $soItems = $groupedBrochuresSo[$year] ?? []; $brochureItems = $groupedBrochures[$year] ?? []; // 取同一年份下两个数组的最大条目数作为循环次数 $maxCount = max(count($soItems), count($brochureItems)); for ($i = 0; $i < $maxCount; $i++) { $peilingen[] = [ $year => [ 'brochure_so' => $soItems[$i] ?? ['vakgebied' => '', 'onderwijsniveau' => ''], 'brochure' => $brochureItems[$i] ?? ['vakgebied' => ''] ] ]; } }
如果需要按字段匹配而非顺序匹配合并,可以在分组后增加自定义匹配逻辑,调整条目配对规则即可。
内容的提问来源于stack exchange,提问作者sander
相关产品推荐
相关产品推荐

