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

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

我想要上面数组中的以下数组,其中包含两个数组中不常见的项目。

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

我试过以下

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

怎么可能。谢谢。

4

3 回答 3

1

只需减去并集和交集:

在此处输入图像描述

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

$output = array_diff(array_merge($array1, $array2), array_intersect($array1, $array2));
于 2013-10-28T07:10:59.840 回答
0

采用:

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

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

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

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

print_r($output);
于 2013-10-28T07:12:41.253 回答
0

所以我今天早些时候读到关于 array_merge 被认为是慢的。我也读过关于array_diff的相同内容,特别是here。这让我想到同时使用两者可能会特别昂贵,因此我将以下实验放在一起:

我扩展了 merlyn 的功能来提出这个:

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 回答