简单的一个,但仍然无法弄清楚。
我有两个略有不同结构的数组。
第一个数组包含成员(作为第一级索引,例如4,2)及其文档ID(作为第二级索引,例如2,3)和这些文档的部门标记:
array (
4 =>
array (
2 => 'support',
),
2 =>
array (
3 => 'billing',
),
)
第二个数组的第一级索引没有任何意义,所以可以摆脱。但是,第二级索引包含成员ID(例如4,2)和那些成员打开访问权限的部门标记(当前用户):
array (
0 =>
array (
4 =>
array (
'support' => 'support',
'billing' => 'billing',
),
),
1 =>
array (
2 =>
array (
'support' => 'support',
),
),
)
所以我正在尝试编译应该向当前用户显示的文档列表。
例如,由于成员#4已授予对支持和计费的访问权限,因此当前用户应该能够从该成员看到文档#2(标记为支持)。
由于成员#2只能访问支持标记的文档,因此当前用户不应该看到文档#3(标记为计费)。
所以上面的例子应该只给出:
阵列(2)
如何在PHP中生成最终的文档数组,比较两个数组?
答案 0 :(得分:0)
可以通过循环和搜索来执行您想要的操作,但我认为这种数据结构不可维护,并且首先要更改它。好吧,有时你不能,所以这就是我的方式:
$documents_data =[
4 => [2 => 'support'],
2 => [3 => 'billing']
];
$access_data = [
[4 => ['support' => 'support', 'billing' => 'billing']],
[2 => ['support' => 'support']]
];
// You need current user's data so having his id
// extract his access rights from second array
$user_id = 4;
function userData($user_id, $access_table) {
$access = [];
foreach ($access_table as $user_acc) {
if (key($user_acc) !== $user_id) { continue; }
$access = reset($user_acc);
break;
}
return [
'id' => $user_id,
'access' => $access
];
}
$user = userData($user_id, $access_data);
// Filter out documents (if any) not matching user's access rights
function userDocuments($user, $docs) {
if (empty($docs[$user['id']])) { return []; }
return array_filter(
$docs[$user['id']],
function ($doc_type) use ($user) {
return isset($user['access'][$doc_type]);
}
);
}
$allowed_docs = userDocuments($user, $documents_data);