首页 > 解决方案 > 具有多条件的php多维数组差异

问题描述

我在 php 中有 2 个数组:

$all_users = [
    0=[
        user_id = 1,
        team_id = 1,
    ],
    1=[
        user_id = 1,
        team_id = 2,
    ],
    2=[
        user_id = 2,
        team_id = 1,
    ],
    3=[
        user_id = 3,
        team_id = 1,
    ],
];
$selected_users = [
    0=[
        user_id = 1,
        team_id = 1,
    ],
    1=[
        user_id = 3,
        team_id = 1,
    ],
];

我想返回未选中的用户。我的意思是我想要:

$not_selected_users = [
    0=[
        user_id = 1,
        team_id = 2,
    ],
    1=[
        user_id = 2,
        team_id = 1,
    ],
]; 

我怎么能得到这个?

它是一个多条件的多维数组。我使用多个 for、array_search、array_keys 进行测试,但我无法得到它。

注意:在 all_usersuser_id中可以重复,例如每个用户可以在多个团队或其他......我的意思是我们可以在 all_users 数组中重复 user_id。

标签: phparrays

解决方案


// To speed up search you need `user_id` values as keys:
$selected_users_keys = array_column($selected_users, 'user_id', 'user_id');
// next just filter:
$not_selected_users = array_filter(
    $all_users,
    function ($v) use ($selected_users_keys) { 
        return !isset($selected_users_keys[$v['user_id']]); 
    }
);

小提琴

修改后的算法小提琴

$selected_users_keys = [];
foreach ($selected_users as $user) {
    $selected_users_keys[$user['user_id'] . '-' . $user['team_id']] = 1;
}

// next just filter:
$not_selected_users = array_filter(
    $all_users,
    function ($v) use ($selected_users_keys) { 
        return !isset($selected_users_keys[$v['user_id'] . '-' . $v['team_id']]); 
    }
);

print_r($not_selected_users);

推荐阅读