php 个数组的未知数量的笛卡尔积

Cartesian Product on unknown number of php arrays

我需要从多个单独的数组中获取每个唯一的组合。我不知道有多少数组,因为这可能会有所不同。

如果我错了请纠正我,但我认为我应该使用 Cartesian Product 方法。


这是我的数据的基本轮廓。

[
    {
        "department": "CIS",
        "name": "Intro to CIS",
        "sections": {
            "01": {
                "regNum": "012345",
                "days": "MWF",
                "startTime": "900",
                "endTime": "1030",
                "labDay": "M",
                "labStartTime": "1300",
                "labEndTime": "1500"
            },
            "02": {
                "regNum": "098304",
                "days": "TR",
                "startTime": "1300",
                "endTime": "1500",
                "labDay": "",
                "labStartTime": "",
                "labEndTime": ""
            }
        }
    },
    {
        "department": "MATH",
        "name": "Intro to MATH",
        "sections": {
            "01": {
                "regNum": "012345",
                "days": "MWF",
                "startTime": "900",
                "endTime": "1030",
                "labDay": "M",
                "labStartTime": "1300",
                "labEndTime": "1500"
            },
            "02": {
                "regNum": "098304",
                "days": "TR",
                "startTime": "1300",
                "endTime": "1500",
                "labDay": "",
                "labStartTime": "",
                "labEndTime": ""
            }
        }
    }
]

想要的结果:

[[[CIS 01 Array],[MATH 01 Array]],
 [[CIS 01 Array],[MATH 02 Array]],
 [[CIS 02 Array],[MATH 01 Array]],
 [[CIS 02 Array],[MATH 02 Array]]
]

请注意,这些是数组,因为我仍然需要能够访问日期、startTime 等

您不是在做所有部门的笛卡尔积,只是每个部门及其部分的积。您只需要 2 个嵌套循环,一个用于部门,另一个用于部门内的各个部分。然后,您可以将部门名称和部门编号添加到关联数组,并将其推送到结果中。

$departments = json_decode($json_string, true);
$result = array();
foreach ($departments as $dept) {
    $name = $dept['department'];
    foreach ($dept['sections'] as $sectno => $secdata) {
        $secdata['dept'] = $name;
        $secdata['section'] = $sectno;
        $result[] = $secdata;
    }
}

DEMO