2017-01-07 16 views
0

単純なものですが、まだ分かりません。異なる構造の2つの配列を比較し、PHPで要素を見つける

私はわずかに異なる構造の2つの配列を持っています。

最初の配列は、それらの文書の部門タグ(第2レベルインデックス、例えば、2、3のように)メンバー(最初のレベルの指標として、例えば、4、2)およびそれらの文書IDが含まれています

array (
    4 => 
    array (
    2 => 'support', 
), 
    2 => 
    array (
    3 => 'billing', 
), 
) 

2番目の配列の最初のレベルのインデックスは意味を持たないので、取り除くことができます。しかし、第2レベルの指標は、会員IDが含まれ(例えば4を、2)及び部門は、これらのメンバーは、(現在のユーザー)へのアクセスを開くタグ:

array (
    0 => 
    array (
    4 => 
    array (
     'support' => 'support', 
     'billing' => 'billing', 
    ), 
), 
    1 => 
    array (
    2 => 
    array (
     'support' => 'support', 
    ), 
), 
) 

だから私は、表示されるべき文書のリストをコンパイルしようとしています現在のユーザーに送信します。

たとえば、メンバー#4がサポートと請求にアクセスできるので、現在のユーザーはそのメンバーからの文書#2(サポートとしてタグ付けされた)を見ることができます。

メンバー2はタグ付きドキュメントのみをサポートするため、現在のユーザーはドキュメント#3(請求としてタグ付けされています)を見ることができません。

したがって、上記の例では、唯一与える必要があります。

配列(2)

を私は2つの配列を比較するPHPでの文書の最終配列を生成するにはどうすればよいですか?

答えて

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); 
関連する問題