PHP array_intersect + array_flip 具有多次值的数组

Posted

技术标签:

【中文标题】PHP array_intersect + array_flip 具有多次值的数组【英文标题】:PHP array_intersect + array_flip with array that has values multiple times 【发布时间】:2016-01-28 14:50:38 【问题描述】:

我有两个数组:

$arr1 = array(101 => 250, 102 => 250, 103 => 250, 104 => 500, 105 => 500, 106 => 500,);

$arr2 = array(0 => 103, 1 => 104, 2 => 105) 

我想要得到的结果是

Array (103 => 250, 104 => 500)

我尝试过使用

array_intersect(array_flip($arr1), $arr2);

但是

array_flip($arr1)

给出类似的东西

Array(103 => 250, 106 => 500)

因此,键会丢失并且无法正确相交。有没有办法得到想要的结果?

【问题讨论】:

键丢失并不意外 - array_flip 交换键和值,并且由于您有“重复”值,您将丢失一些键。您可以改用array_intersect_keys(),它使用键而不是值进行交叉比较。 【参考方案1】:

下面的代码完成了这项工作。我希望它是不言自明的。

array_unique(array_intersect_key($arr1, array_flip($arr2)))

【讨论】:

完美!我只需要在另一个数组上使用array_flip,然后使用array_intersect_key。有缘由!谢谢:)【参考方案2】:

为此使用标准 php 库函数可能会降低代码的可读性。我会使用一个明确的foreach 循环,该循环覆盖$arr2

$ans = array();

foreach($arr2 as $key) 
    if (isset($arr1[$key]) && !in_array($arr1[$key], $ans)) 
        $ans[$key] = $arr1[$key];
    

这个函数应该是 O(n*n),其中 n 是 $arr2 的长度。

【讨论】:

以上是关于PHP array_intersect + array_flip 具有多次值的数组的主要内容,如果未能解决你的问题,请参考以下文章

php动态array_intersect

php中的array_intersect()具有特殊用途

PHP:正则表达式替代 array_intersect

php array_intersect() 效率

PHP使用array_intersect()函数求数组交集

Php array_intersect输出[重复]