3
$array1 = array("a","b");

$array2 = array("b","c");

両方の配列で共通ではないアイテムを含む上記の配列から次の配列が必要です。

$output = array("a","c");

フォローしてみました

$output = array_diff($array1,$array2);

どのようにそれを行うことができます。ありがとう。

4

3 に答える 3

0

そこで、array_merge がどのように遅いと見なされたかについて、今日の早い段階で読みました。特にここでは、array_diffについても同じことを読みました。これにより、両方を同時に使用すると特にコストがかかる可能性があると考えるようになり、次の実験をまとめました。

私はマーリンの機能を拡張して、これを考え出しました:

function multiArrayUnique($array1, $array2)
{
    //leaves array1 intact
    $arrayFrom1=$array1;
    $arrayAgainst = array_flip($array2);

    foreach ($arrayFrom1 as $key => $value) {
        if(isset($arrayAgainst[$value])) {
            unset($arrayFrom1[$key]);
        }
    }
    //arrayFrom1=array("a");

    $arrayFrom2=$array2;//b,c
    $arrayAgainst = array_flip($array1);//a,b
    foreach ($arrayFrom2 as $key => $value) {
        if(isset($arrayAgainst[$value])) {
            unset($arrayFrom2[$key]);
        }
    }
    //arrayFrom2=array("c");

    foreach ($arrayFrom2 as $item) {
        array_push($arrayFrom1, $item);
    }

    return $arrayFrom1;
}

OPの例を使用すると、この関数は も返しますarray("a","c")

さて、これは膨大な量のコードであり、読むのは困難です... しかし、大規模なデータセットで得られる効率は次のとおりです。

$a1 = range(0,25000); 
$a2 = range(15000,50000);

$start=microtime(true);
$output = array_diff(array_merge($a1, $a2), array_intersect($a1, $a2));
$end=microtime(true);
echo $end-$start."<hr>";

7.5844340324402

$start=microtime(true);
$output = array_merge(array_diff($a1,$a2),array_diff($a2,$a1));
$end=microtime(true);
echo $end-$start."<hr>";

6.551374912262

$start=microtime(true);
$result=multiArrayUnique($a1,$a2);
$end=microtime(true);
echo $end-$start."<hr>";

0.21001195907593

そのため、関数のコードはかなり複雑で、他の制限がある場合もありますが、実装は依然としてワンライナーであり、処理時間は 14 倍高速です。

于 2013-10-28T09:38:18.853 に答える