【问题标题】:Using array_intersect on a multi-dimensional array在多维数组上使用 array_intersect
【发布时间】:2011-08-04 22:12:17
【问题描述】:

我有两个看起来像这样的数组:

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

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

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

并且我希望能够通过比较两个主阵列中的子阵列的 ID 来复制 array_intersect。到目前为止,我的尝试还没有成功。 :(

【问题讨论】:

  • 进行自定义比较,您需要使用array_uintersect() php.net/array_uintersect,它使用用户定义的比较函数。

标签: php arrays multidimensional-array array-intersect


【解决方案1】:

使用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
        )

)

【讨论】:

  • 如何修改它以确保所有列都匹配,而不仅仅是“值”?
  • @bafromca 我认为 return strcmp(serialize($val1), serialize($val2));可能工作
【解决方案2】:
function compareDeepValue($val1, $val2)
{
   return strcmp($val1['value'], $val2['value']);
}

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

【讨论】:

    【解决方案3】:

    您可以将嵌入式函数与 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 2014-06-11
      • 2011-08-13
      • 2013-09-30
      • 1970-01-01
      • 2014-12-25
      • 2021-03-01
      相关资源
      最近更新 更多