2012-03-21 26 views
1

に一致していないリスト項目の比較:は、2つの配列と、私は、次の二つの配列を持つキー

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

あなたは、少なくとも1つのループを使用する必要がありますこのため。何を試しましたか? – Yoshi

+0

@Yoshi [No loops!](http://codepad.viper-7.com/hl3RiS)(はい、私は知っている、誰もスマートなお尻を好きではない) – cmbuckley

+1

@cbuckleyそれはちょうど隠れたループです。それにもかかわらず素敵なものです! – Yoshi

答えて

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

print_r($result); 
0

指数時間はO(n^2)を使用すると手に負えなくなる可能性があり、すべての$はuserStatusのための$ユーザーを横断避けるために、論理的な方法はありません。

代わりに、$ 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 
    } 
} 

共通PHP関数の時間計算量に関するいくつかの情報のためthis関連記事をチェックしてください。

0

この答えは、もともと私は冗談されていた、と私はそのsafarovの答えを示唆しているが、明確なですが、ここでは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; 
})); 
関連する問題