比较两个数组和列表中与键不匹配的项

时间:2012-03-21 23:38:20

标签: php arrays

我有以下两个数组:

userStatus
---------------
Array
(
    [0] => Array
        (      
            [Username] => cynthia@test.net
            [Status] => Active
        )

    [1] => Array
        (           
            [Username] => mary@test.net
            [Status] => Terminated
        )

    [2] => Array
        (           
            [Username] => steve@test.net
            [Status] => OnVacation
        )
)

users
------
Array
(
    [0] => steve@test.net
    [1] => mark@test.net
    [2] => cynthia@test.net
)

我想编写一个片段,显示所有userStatus条目的数组,这些条目与用户数组中的用户名字段不匹配。

我该怎么做?我似乎没有找到一种有效而快速的方法在PHP中执行此操作。

由于

3 个答案:

答案 0 :(得分:2)

$result = array();
foreach($userStatus as $value) {
     if(!in_array($value['Username'], $users) {
        $result[] = $value;
     }
}

print_r($result);

答案 1 :(得分:0)

使用当前数组,没有合理的方法可以避免每个$ userStatus遍历$ users,这将使用指数时间O(n ^ 2)并且可能会失控。

如果您可以将$ users转换为哈希值(可能是array_flip),那么您可以在线性时间O(n)中执行此操作。

$usersHash = array_flip($users);

foreach ($userStatuses as $status) {
    if (!array_key_exists($status['username'], $usersHash)) {
        // do something with the user
    }
}

查看this相关帖子,了解有关常见PHP函数时间复杂性的一些信息。

答案 2 :(得分:0)

这个答案最初是我的滑稽,我建议safarov的答案是最清楚的,但这是一个自定义回调array_diff的解决方案:

$userStatus = array(
    array('Username' => 'cynthia@test.net', 'Status' => 'Active'),
    array('Username' => 'mary@test.net',    'Status' => 'Terminated'),
    array('Username' => 'steve@test.net',   'Status' => 'OnVacation'),
);

$users = array(
    'cynthia@test.net',
);

var_dump(array_udiff($userStatus, $users, function($status, $user) {
    return $status['Username'] !== $user;
}));