1

これがコードです、それは非常に簡単です:

<?php
$tab = array (
    (object)array( 'id' => 1,),
    (object)array( 'id' => 4,),
    (object)array( 'id' => 12,),
    (object)array( 'id' => 22,),
    (object)array( 'id' => 25,),
);

$tab_json = array (
    (object)array( 'id' => 1,),
    (object)array( 'id' => 4,),
    (object)array( 'id' => 12,),
    (object)array( 'id' => 22,),
    (object)array( 'id' => 25,),
    (object)array( 'id' => 2,),
);
$difference = array_udiff($tab_json, $tab, function($a, $b) {
    echo $a->id." <-> ".$b->id."\n";
    return (count(array_diff_assoc(get_object_vars($a), get_object_vars($b))))>0;
});
?>

出力は次のとおりです。

12 <-> 4
12 <-> 1
12 <-> 22
12 <-> 25
2 <-> 12
4 <-> 25
4 <-> 1
22 <-> 4
25 <-> 1
12 <-> 4
12 <-> 1
12 <-> 22
25 <-> 12
4 <-> 22
1 <-> 4
1 <-> 22
1 <-> 4
1 <-> 1
1 <-> 25
25 <-> 4
25 <-> 1
25 <-> 12
25 <-> 25
25 <-> 4
4 <-> 1
4 <-> 12
4 <-> 25
4 <-> 22
22 <-> 1
22 <-> 12
22 <-> 25
22 <-> 12
12 <-> 1
12 <-> 12
12 <-> 2
2 <-> 12
2 <-> 25

計算方法がわかりません。見てください12:10回以上比較されています(私が理解していることから、2番目の配列の要素数以下で比較する必要があります)。さらに、3回比較されています。1!!

テスト済み:

PHP 5.3.9
PHP 5.3.2-1ubuntu4.14
4

1 に答える 1

0

array_udiff()実際に結果を生成する方法は、もちろん実装の詳細であり、変更される可能性があります。ですから、私が言っていることは今は真実かもしれませんが、あなたはそれに頼ってはいけません。

たとえば、古いバージョンのPHPを使用する必要がある場合は、最初の配列の各要素を2番目の配列の各要素と単純に比較し、一致するものをすべて破棄する互換性バージョンの関数を実装することをお勧めします。

一方、最高のパフォーマンスが必要な場合は、2番目の配列の要素をクイックソートしてから、最初の配列の要素のバイナリ検索を実行します。

PHP 5.3は、クイックソートと線形検索を組み合わせているようです。ただし、より大きな要素が見つかると、検索は中止されます。

于 2012-04-22T20:30:06.370 に答える