2011-07-06 7 views
3
$arr1 = array('potato'=>1,'tomato'=>2,'apple'=>5,'banana'=>10); 
$arr2 = array('orange'=>20,'tomato'=>3,'apple'=>5,'banana'=>20); 

array( 'tomato'、 'banana')を返す関数が必要ですが、どちらか一方の配列に存在しないキーが省略されていると考えてください。 Appleは両方の配列で同じ値を持っているので省略しなければならない - 返されるのは、値が異なり設定されているキーだけでなければならない。2つの配列の異なる値に対応するキーを取得する方法は?

+0

'リンゴ' も両方の配列に存在しないので、省略すべきではありませんか? – aardvarkk

+0

リンゴは両方の配列で同じ値を持っていますので、省略しなければなりません - 返されるのは、値が異なり設定されているキーだけです – rsk82

+0

なぜ私は負のポイントを得たのでしょうか... – rsk82

答えて

4

これは動作するはずです(demo):

$arr1 = array('potato'=>1,'tomato'=>2,'apple'=>5,'banana'=>10); 
$arr2 = array('orange'=>20,'tomato'=>3,'apple'=>5,'banana'=>20); 
$result = array_keys(array_diff(array_intersect_key($arr1, $arr2), $arr2)); 
print_r($result); 

出力:

Array 
(
    [0] => tomato 
    [1] => banana 
) 

参考:

0

array_intersectarray_keysを使用することができる。

$arr3 = array_intersect(array_keys($arr1), array_keys($arr2)); 
+0

それは 'apple'も返すので、答えは – rsk82

+4

-1ではありません。なぜなら、OPが尋ねるものを行い、キーと交差したいのであれば、 'array_intersect_keys'を使用します。 – Gordon

+0

+1 OPの質問は曖昧です。 –

1

私は単純なループを行います。

大規模な配列を比較する必要がある場合はもちろん、ネイティブのPHP関数が大いに役立つ可能性があります。まだこれを行うための最も最適な方法は何になるのでしょう。

2
$array3 = array(); 
foreach(array_intersect_key($array1, $array2) as $key => $v){ 
if($array1[$key] != $array2[$key]) $array3[] = $key; 
} 
2
<?php 
/** 
* Returns an array which contains keys which are in both $array1 
* and $array2, and which have different values. 
*/ 
function getKeysWhichMatchAndHaveDifferentValues($array1, $array2) 
{ 
    $arrIntersected = array_intersect_key($array1, $array2); 
    foreach($arrIntersected as $key => $value) 
    { 
      if($array2[$key] == $value) { 
        unset($arrIntersected[$key]); 
      } 
    } 
    return array_keys($arrIntersected); 
} 

$arr1 = array('potato'=>1,'tomato'=>2,'apple'=>5,'banana'=>10); 
$arr2 = array('orange'=>20,'tomato'=>3,'apple'=>5,'banana'=>20); 

$final = getKeysWhichMatchAndHaveDifferentValues($arr1, $arr2); 
echo '<pre>' . print_r($final) . '</pre>'; 
?> 
関連する問題