繁体   English   中英

如何做数组的交集

[英]How to do an intersection of arrays of 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]]对你来说清楚吗?

谢谢

@KANDROID操作系统,请检查以下示例以了解数组的交集。

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

$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
        )
)

您可以像这样递归地执行此操作:

$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)
           )

但是,您必须小心,在使用回调的示例中,尝试对“名称”和“ id”值使用相交将不会像您期望的那样返回成对的值。 它只需要找到一个值,因此,如果您尝试搜索与另一个“ id”相对应的“名称”,即使该“组合”不存在,您也将获得两项。 即使您像这样在搜索中使用键,它也会做同样的事情:

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

我只是注意到了这个问题,所以我想提出来。 根据您要执行的操作,无论如何,您都可能需要某种递归方面,如我所展示的。

希望这可以帮助 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM