比较两个不同结构的数组,并在PHP中查找元素

时间:2017-01-07 03:17:28

标签: php arrays

简单的一个,但仍然无法弄清楚。

我有两个略有不同结构的数组。

第一个数组包含成员(作为第一级索引,例如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中生成最终的文档数组,比较两个数组?

1 个答案:

答案 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);