比较两个数组并列出常用条目

时间:2012-03-20 06:46:46

标签: 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内置数组函数或任何其他方式来实现这一点吗?

2 个答案:

答案 0 :(得分:0)

如果你使用PHP> = 5.3那么你可以使用带有匿名回调函数的array_filter ...不是特别有效,但很简单。

$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(
     'steve@test.net',
     'mark@test.net',
     'cynthia@test.net'
);


$filtered = array_filter($userStatus, function ($var) {
 global $users;
 return in_array($var['Username'], $users);
});

print_r($filtered);

如果您稍微快点一点,那么将用户数组转换为“地图”,方法是将值更改为键,然后检查是否在回调中设置了键。

$userlookup = array_flip($users);

$filtered = array_filter($userStatus, function ($var) {
 global $userlookup;
 return isset($userlookup[$var['Username']]);
});

答案 1 :(得分:-1)

如果您想要快速,请按以下方式设置用户数组:

$users = array(
    'steve@test.net' => 1,
    'mark@test.net' => 1,
    'cynthia@test.net' => 1
);

然后检查是否设置了数组索引:

$matched = array();
foreach($userStatus as $k => $v) {
    if(isset($users[$v['Username']])) {
        $matched[$k] = $v;
    }
}

输出:

foreach($matched as $k => $v) {
    echo "$k = ".$v['Username']." is ".$v['Status']."<br>";
}