2012-03-21 30 views
1

我有以下兩個數組:比較兩個數組和列表項不匹配上的關鍵

userStatus 
--------------- 
Array 
(
    [0] => Array 
     (  
      [Username] => [email protected] 
      [Status] => Active 
     ) 

    [1] => Array 
     (   
      [Username] => [email protected] 
      [Status] => Terminated 
     ) 

    [2] => Array 
     (   
      [Username] => [email protected] 
      [Status] => OnVacation 
     ) 
) 

users 
------ 
Array 
(
    [0] => [email protected] 
    [1] => [email protected] 
    [2] => [email protected] 
) 

我想寫的是帶來了不匹配的所有userStatus項的數組的一個片段在用戶數組中的用戶名字段。

我該怎麼做?我似乎沒有找到一種有效且快速的方法來在PHP中執行此操作。

感謝

+2

你必須至少使用一個循環爲了這。你有什麼嘗試? – Yoshi 2012-03-21 23:44:38

+0

@Yoshi [無循環!](http://codepad.viper-7.com/hl3RiS)(是的,我知道,沒有人喜歡聰明的屁股) – cmbuckley 2012-03-22 00:07:27

+1

@cbuckley這只是一個很好的隱藏循環;)。但是一個很好的!應該將其添加爲答案 – Yoshi 2012-03-22 00:10:26

回答

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

print_r($result); 
0

根據您當前的陣列有避免遍歷$用戶每$ userStatus它將使用指數時間爲O(n^2),並可能失控不符合邏輯的方式。

如果您可以將$用戶轉換爲散列(也許是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函數複雜的一些信息。

0

這個答案本來是我在開玩笑,我會建議薩法羅夫的答案是清楚的,但這裏有一個自定義回調的解決方案和array_diff:

$userStatus = array(
    array('Username' => '[email protected]', 'Status' => 'Active'), 
    array('Username' => '[email protected]', 'Status' => 'Terminated'), 
    array('Username' => '[email protected]', 'Status' => 'OnVacation'), 
); 

$users = array(
    '[email protected]', 
); 

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