我有以下两个数组:
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中执行此操作。
由于
答案 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;
}));