2014-10-30 53 views
1

我想在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]]这对你很清楚?

谢谢

+1

什么是您的实际投入,以及您期望得到什么结果? – 2014-10-30 12:56:56

+0

和另一个阵列是什么样子? – 2014-10-30 12:59:22

+0

只是谷歌的“array_intersect_recursive”,这是在php.net上的array_intersect页面上的这样的例子 – rjdown 2014-10-30 13:00:11

回答

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 
     ) 
) 
+0

感谢这是非常有帮助 – Karimx 2014-10-30 13:15:17

+0

@KANDROID操作系统,很高兴!我可以帮助解决您的问题。 – 2014-10-30 13:17:21

+0

我试图在框架Codeigniter中显示它显示一个错误,他无法识别函数comparevalue – Karimx 2014-10-30 13:19:50

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

你必须要小心,使用回调的例子,试图使用“name”和“身份证”值相交将不会返回配对值,你可能期望。它只需要查找其中一个值,因此如果您尝试搜索与“不同”“id”相对应的“名称”,即使该“组合”不存在,您也会同时返回两个项目。它会做同样的事情,即使你在这样的搜索中使用的按键:

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

我只注意到这个问题,所以我想我应该把它。根据你想要做的事情,无论如何,你可能需要某种递归方面,就像我所展示的那样。

希望这会有所帮助:)