2016-12-02 6 views
3

私は異なるフォーマットの異なるデータソースの2つのデータ配列を持っていますが、それらは同じリソースを表しています。したがって、一方のidは、例えば他方の​​と同じです。PHP配列の相違の種類

現在、私は配列のうちの1つを他のものと一致するように変換してから、array_udiffでそれらを実行して違いを得ます。

しかし、3つのプロパティを比較して一致するかどうかを確認する必要があるため、3つのフィールドが一致するか一致しないため、-1,0,1を返すことはできません。

私は単純に返す-1または0の場合、それは$bから$aを比較する動作しますが、$b

$arr_a = [['id'=>1, 'a'=>1, 'b'=>0],['id'=>2, 'a'=>2, 'b'=>3],['id'=>3, 'a'=>1, 'b'=>0]]; 
$arr_b = [['id'=>3, 'a'=>1, 'b'=>0],['id'=>4, 'a'=>2, 'b'=>3],['id'=>5, 'a'=>1, 'b'=>0]]; 

function diff($a, $b) { 
    if(($a['id'] == $b['id']) 
     && ($a['a'] == $b['a']) 
     && ($a['b'] == $b['b']) 
    ) { 
    return 0; 
    } else { 
    return -1; 
    } 

$not_in_b = array_udiff($arr_a, $arr_b,'diff'); 
$not_in_a = array_udiff($arr_b, $arr_a,'diff'); 

print_r($not_in_b); 
print_r($not_in_a); 

$aに上記のリターンを比較失敗...

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [a] => 1 
      [b] => 0 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [a] => 2 
      [b] => 3 
     ) 

) 
Array 
(
    [0] => Array 
     (
      [id] => 3 
      [a] => 1 
      [b] => 0 
     ) 

    [1] => Array 
     (
      [id] => 4 
      [a] => 2 
      [b] => 3 
     ) 

    [2] => Array 
     (
      [id] => 5 
      [a] => 1 
      [b] => 0 
     ) 

) 

あなたが見ることができるように$a$bの差分は動作しますが、$b$aはありません...

私は平等のために、このように複数のvaulesを比較するにはどうすればよい

...

この作品

UPDATEが、キーとして3つの特定のプロパティ値を持つ2つのアレイを作製...

$arr_a = [['id'=>1, 'a'=>1, 'b'=>0],['id'=>2, 'a'=>2, 'b'=>3],['id'=>3, 'a'=>1, 'b'=>0]]; 
$arr_b = [['id'=>3, 'a'=>1, 'b'=>0],['id'=>4, 'a'=>2, 'b'=>3],['id'=>5, 'a'=>1, 'b'=>0]]; 

$arra_a_keys=[]; 
foreach($arr_a as $item) { 
    $arra_a_keys[$item['id'].'_'.$item['a'].'_'.$item['b']] = $item; 
} 

$arra_b_keys=[]; 
foreach($arr_b as $item) { 
    $arra_b_keys[$item['id'].'_'.$item['a'].'_'.$item['b']] = $item; 
} 

$not_in_b = array_diff_key($arra_a_keys, $arra_b_keys); 
$not_in_a = array_diff_key($arra_b_keys, $arra_a_keys); 

print_r($not_in_b); 
print_r($not_in_a); 
+2

「いずれも動作していません」。とにかく試したコードを表示して、それがうまくいかないところで_を記述してください。 –

+0

どのような比較基準がありますか? 'id'と' guid'だけが一致しますか? – sevavietl

+0

@PatrickQ私はいくつかの詳細を含む例を追加しました... –

答えて

0

あなたはidで比較することが

$ids1 = []; 
    foreach($a as $v1){ 
     $i1[] = $v1['id']; 
    } 
    $ids2 = []; 

    foreach($b as $v2){ 
     $i2[] = $v2['guid']; 
    } 
    $one_notin_two = array_diff($i1,$i2); 
    $two_notin_one = array_diff($i2,$i1); 
1

同等のメイクアレイ用のforeachを使用することができます次の操作を行うことができます:

$ids = array_column($a, 'id'); 
$guids = array_column($b, 'guid'); 

$not_in_b = array_filter($a, function ($item) use ($guids) { 
    return !in_array($item['id'], $guids); 
}); 
$not_in_a = array_filter($b, function ($item) use ($ids) { 
    return !in_array($item['guid'], $ids); 
}); 

ここはworking demoです。

追加:

また、あなたはarray_udiffでそれを行うことができます:ここで

$compareFunction = function ($a, $b) { 
    $id1 = isset($a['id']) ? $a['id'] : $a['guid']; 
    $id2 = isset($b['id']) ? $b['id'] : $b['guid']; 

    return strcmp($id1, $id2); 
}; 

$not_in_b = array_udiff($a, $b, $compareFunction); 
$not_in_a = array_udiff($b, $a, $compareFunction); 

working demoです。

array_udiffは実際には最も単純な関数ではありません。ドキュメントにはこれに関することは何もありませんが、コールバック関数を使用して配列を比較するだけでなく、並べ替えもします。最初の引数は、第二のより、またはそれ以上に等しい、よりそれぞれ 未満であると考えられる場合に比較関数に等しい、より小さい整数、またはゼロより大きい を返さなければならない理由

です。

しかし、このソートはまたトリックプログラマ、彼は機能int callback (mixed $a, mixed $b)$aのものに期待されるので$array1から来ていると$b$array2から来ています。そうではありません。詳細はthis articleをご覧ください。だから私はソリューションがより理解できると思う。

0

これはarray_column()array_diff()を使って解決できます。ここで

はサンプルコードです:See Live Demo

$a = [['id' => 1], ['id' => 2], ['id' => 3], ['id' => 4]]; 
$b = [['guid' => 3], ['guid' => 4], ['guid' => 6], ['guid' => 7]]; 

$a = array_column($a, 'id'); 
$b = array_column($b, 'guid'); 

$not_in_b = array_diff($a, $b); 
$not_in_a = array_diff($b, $a); 

は、それはあなたの問題を解決する必要があります願っています。ありがとうございました。