验证二维数组中的所有行数据是否满足另一个二维数组的行

问题描述 投票:0回答:1

我需要确认员工数组中的数据是否满足所有任务行。 对于任务数组中的每个对应日期,六个分隔小时值中的每一个都必须等于或小于员工数组中对应的小时值。

$mission = [
    ['days' => 'Monday', 'hours' => '1,0,0,0,0,0'],
    ['days' => 'Tuesday', 'hours' => '1,1,0,0,0,1'],
];

$employee = [
    ['days' => 'Monday', 'hours' => '1,0,0,0,0,0'],
    ['days' => 'Tuesday', 'hours' => '1,1,0,0,0,1'],
    ['days' => 'Wednesday', 'hours' => '1,1,0,0,0,1'],
];

如果员工周一周二有空(如上述情况),并且包含工作时间(1和0代表时间,每个项目的位置非常重要),则可以接受任务。

我的一些代码:

foreach ($mission as $m) {
    # code...
    $m_days[] = $m['days'];
    foreach ($employee as $e) {
        $e_days[] = $e['days'];
    }
    $i++;
}
/// First condition if m_days > e_days so valid
$valid = (sizeof($m_days) > sizeof($e_days)) ? true : false;

此后,我不知道如何比较员工是否至少可以完成任务时间。例如,如果任务是星期一,工作时间为:

1,1,0,0,0,1
,而员工周一有空,工作时间为:
1,1,1,0,0,1
——他可以接受任务。但是,如果员工周一的空闲时间为:
1,0,0,0,0,1
,则无法执行任务。

我尝试使用

array_diff()
,但它没有像这里所示那样工作。

php arrays validation multidimensional-array
1个回答
0
投票

为了避免过多的计算,请创建员工数据的查找数组/映射,其中天数用作键,小时数被解析为每天的平面数组。

然后通过比较两个子数组中占据相同位置的小时整数来验证任务数组的总覆盖范围。

结果的真假取决于是否满足所有任务要求。

代码:演示(环境中包含polyfill

$employeeMap = [];
foreach ($employee as ['days' => $d, 'hours' => $h]) {
    $employeeMap[$d] = explode(',', $h);
}

var_export(
    array_all(
        $mission,
        fn($row) => isset($employeeMap[$row['days']])
            && array_all(
                explode(',', $row['hours']),
                fn($v, $k) => $v <= $employeeMap[$row['days']][$k]
            )
    )
);
© www.soinside.com 2019 - 2024. All rights reserved.