如何做一个数组的数组交集

时间:2014-10-30 12:51:31

标签: php arrays

我正在尝试在php中尝试创建一个数组数组的交集。我找到了array_intersect($resultx,$resulty);,但它只适用于具有一个值的表。在我的情况下,我有这样的数组数组。

Array
 (
[0] => Array
    (
        [name] => Chris
        [id] => 1033
    )

[1] => Array
    (
        [name] => Vins
        [id] => 1034
    )

[2] => Array
    (
        [name] => Steve 
        [id] => 1035
    )

[3] => Array
    (
        [name] => Henry 
        [id] => 1036
    )

[4] => Array
    (
        [name] => Jack 
        [id] => 1037
    )

[5] => Array
    (
        [name] => Paul
        [id] => 1038
    )
 )

为了恢复我的问题,我正在努力建立一个像我提到的那样的很多桌子的交集。所以任何想法

示例tab1 [[1,2,3],[2,3,1]] tab2 [[1,2,3],[5,7,7]结果将是tab3 [[1,2, 3]你很清楚吗?

由于

2 个答案:

答案 0 :(得分:1)

@KANDROID OS,请查看下面的数组交叉示例。

假设您有两个如下所示的数组:

$arr1 = array(
           array('name' => 'Chris','id' => '1111'),
           array('name' => 'Vins','id'  => '1112'),
           array('name' => 'Steve','id' => '1113'),
        );

$arr2 = array(
           array('name' => 'Chris','id' => '1111'),
           array('name' => 'dddd','id' => '2222'),
        );

您可以使用array_uintersect()来使用自定义比较函数,如下所示:

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

function comparevalue($val1, $val2)
{
   return strcmp($val1['id'], $val2['id']);
}

以上结果如下:

Array
(
    [0] => Array
        (
            [name] => Chris
            [id] => 1111
        )
)

答案 1 :(得分:0)

你可以递归地这样做:

$arr1 = array(
          array('name' => 'Chris', 'id' => '1033'),
          array('name' => 'Vins',  'id' => '1034'),
          array('name' => 'Steve', 'id' => '1035'),
          array('name' => 'Henry', 'id' => '1036'),
          array('name' => 'Jack',  'id' => '1037'),
    );

$find   =  array(                              // Array for ANY search criteria, 
             array(1033),                      // name, id, etc.
             array('Vins')                     // (Each element needs to be an array)
          );

$match  =   array();                           // Define array for results    

for($i=0; $i < count($arr1); $i++){            // For every "name/id combo",
    for($j = 0; $j < count($find); $j++){      // go through every search criteria 

      $thisMatch = array_intersect( $arr1[$i], $find[$j]); // and check for a match

      if ($thisMatch){                         // If a match was found,
            $match[]    =   $arr1[$i];         // add it to the results array
            }
        }
    }

var_dump($match);

这将导致:

Array
  [0] => 
      Array (
          'name' => string 'Chris' 
          'id' => string '1033' 
           )
  [1] => 
      Array (
          'name' => string 'Vins' (length=4)
          'id' => string '1034' (length=4)
           )

你必须要小心,使用回调的例子,尝试使用相交的名称&#39;和&#39; id&#39;值不会像您期望的那样返回配对值。它只需要查找其中一个值,因此如果您尝试搜索名称&#39;对应于不同的ID,您将获得两个项目,即使该组合&#34;组合&#34;不存在。即使您在搜索中使用这样的键,它也会做同样的事情:

$find   =  array(  
              array('id' => 1033),                    
              array('name' => 'Vins') 
                );

我刚刚注意到这个问题所以我认为我会把它提起来。根据您尝试做的事情,您可能需要某种递归方面,就像我所展示的那样。

希望这会有所帮助:)