阵列交集 - 仅一次

时间:2014-08-01 06:44:18

标签: php arrays array-intersect

新手在这里,所以我对array_intersect函数有问题。我正在比较两个数组与交集,但我得到一些结果两次。例如:2个数组

$array1 = array(apple, orange, orange, apricot, melon, watermelon);
$array2 = array(apple, orange);

$result = array_intersect($array1, $array2);返回:

$result = array(apple, orange, orange);

但我想要这个:

$result = array(apple, orange);

我希望每次都返回appleorange ONCE。目前它返回苹果,然后是橙色,然后是另一个橙色。我错过了什么,或者我只是使用了错误的功能。

编辑:根据答案,我必须澄清这一点。如果第二个数组是

$array1 = array(apple, orange, orange, apricot, melon, watermelon);
$array2 = array(apple, orange, orange);

我希望结果有2个橙子,所以array_unique不会这样做。

$result = array(apple, orange, orange);

5 个答案:

答案 0 :(得分:2)

如果只需要一次结果,则必须使用array_unique()过滤它们。 array_intersection()只会产生它们的共同点。这是橙色的,在你的情况下是两次$ array1。问题是为什么$ array1中有两个橙色?

http://ch2.php.net/manual/en/function.array-unique.php

编辑:这可能有效:

$array1 = array('apple', 'orange', 'orange', 'apricot', 'melon', 'watermelon');
$array2 = array('apple', 'orange');
$result = array_intersect($array1, $array2);
$diff = array_diff($result, $array2);
if(!empty($diff)) {
    $result = array_unique($result);
}

答案 1 :(得分:1)

试试这个

<?php
$array1 = array('apple', 'orange', 'orange', 'apricot', 'melon', 'watermelon');
$array2 = array('apple', 'orange');
$result = array_intersect($array1, $array2);
$result = array_unique($result);
?>

答案 2 :(得分:1)

循环通过第一个数组。如果第二个数组有值,则将其置于结果并从第二个数组中删除。

$array1 = array('apple', 'orange', 'orange', 'apricot', 'melon', 'watermelon');
$array2 = array('apple', 'orange');
$array3 = array('apple', 'orange', 'orange');

function my_intersect($array1, $array2)
    {
    // array_walk($array1, 'sort');
    // array_walk($array2, 'sort');
    return array_filter($array1, function($item)use(&$array2)
        {
        if (($key = array_search($item, $array2)) !== false)
            {
            unset($array2[$key]);
            return true;
            }
        return false;
        });
    }

var_dump(my_intersect($array1, $array2)); // 'apple', 'orange'
var_dump(my_intersect($array1, $array3)); // 'apple', 'orange', 'orange'

答案 3 :(得分:0)

这对我有用

$result = array_flip( array_flip( array_intersect($array1, $array2) ) );

答案 4 :(得分:0)

你可能需要这样的东西吗? http://php.net/manual/en/function.array-intersect-assoc.php

$array1 = array('apple', 'orange', 'orange', 'apricot', 'melon', 'watermelon');
$array2 = array('apple', 'orange');
$array3 = array('apple', 'orange', 'orange');


var_dump(array_intersect_assoc($array1,$array2));
var_dump(array_intersect_assoc($array1,$array3));