You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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字段留空

最终输出表格效果

JaarBrochure_soBrochure
2022Wiskunde - 1ste graad a- en b-stroomTest
2022Nederlands - 1ste graad a- en b-stroom
2021PAV - 3de graad bsoWiskunde
2021Kritisch 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 18:57:18