在多维数组中使用array_intersect

31
我有两个数组,它们都长这样:

I have two arrays that both look like this:

Array
(
    [0] => Array
        (
            [name] => STRING
            [value] => STRING
        )

    [1] => Array
        (
            [name] => STRING
            [value] => STRING
        )

    [2] => Array
        (
            [name] => STRING
            [value] => STRING
        )
)

我希望能够通过比较两个主数组中子数组的ID来复制array_intersect函数。到目前为止,我的尝试都没有成功 :(


3
如果要进行自定义比较,需要使用array_uintersect()函数 http://php.net/array_uintersect,它使用用户定义的比较函数。 - Wiseguy
尽管这篇旧帖子获得了许多赞,但你的问题并没有包含一个好的、清晰的 [mcve]。 - mickmackusa
比较两个二维数组并获取交集和差异。 - mickmackusa
3个回答

57

使用array_uintersect()函数来使用自定义比较函数,例如:

$arr1 = array(
           array('name' => 'asdfjkl;', 'value' => 'foo'),
           array('name' => 'qwerty', 'value' => 'bar'),
           array('name' => 'uiop', 'value' => 'baz'),
        );

$arr2 = array(
           array('name' => 'zxcv', 'value' => 'stuff'),
           array('name' => 'asdfjkl;', 'value' => 'foo'),
           array('name' => '12345', 'value' => 'junk'),
           array('name' => 'uiop', 'value' => 'baz'),
        );

$intersect = array_uintersect($arr1, $arr2, 'compareDeepValue');
print_r($intersect);

function compareDeepValue($val1, $val2)
{
   return strcmp($val1['value'], $val2['value']);
}

这将产生你所期望的结果:

Array
(
    [0] => Array
        (
            [name] => asdfjkl;
            [value] => foo
        )

    [2] => Array
        (
            [name] => uiop
            [value] => baz
        )

)

你怎么修改代码以确保所有列都匹配,而不仅仅是“value”? - bafromca
2
@bafromca 我认为返回 strcmp(serialize($val1), serialize($val2)); 可能会起作用。 - ChrisS
最好使用递归函数,例如:function compare_arrays($a, $b) { if (is_array($a) && is_array($b)) { $diff = array_udiff($a, $b, 'compare_arrays'); return empty($diff) ? 0 : 1; } return ($a < $b) ? -1 : 1; } $result = array_uintersect($a, $b, 'compare_arrays'); - rubo77

4
您可以使用嵌套函数与array_uintersect PHP函数。例如:
$intersectNames = array_uintersect($arr1, $arr2, function ($val1, $val2){
    return strcmp($val1['name'], $val2['name']);
    });

$intersectValues = array_uintersect($arr1, $arr2, function ($val1, $val2){
    return strcmp($val1['value'], $val2['value']);
    });

print_r('namesIntersected' => $intersectNames, 'valuesIntersected' => $intersectValues)

3
function compareDeepValue($val1, $val2)
{
   return strcmp($val1['value'], $val2['value']);
}

确保val1数组中存在val2键,因为函数首先对数组进行排序。非常奇怪。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接