【问题标题】:How to do an intersection of arrays of arrays如何做数组数组的交集
【发布时间】:2014-10-30 12:51:31
【问题描述】:

我正在尝试在 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]] 你清楚吗?

谢谢

【问题讨论】:

  • 您的实际输入是什么?您希望得到什么结果?
  • 另一个数组会是什么样子?
  • 只是谷歌“array_intersect_recursive”,在 php.net 的 array_intersect 页面上有这样的例子
  • 我的实际输入了一些表格,例如我在问题正文中提到的表格,我期望一个包含所有元素交集的结果表。示例tab1[[1,2,3],[2,3,1]] tab2[[1,2,3],[5,7,7] 结果将是tab3[[1,2,3]] 你很清楚吗?
  • @KANDROID OS,我已经发布了你的问题的答案,你能看一次吗?如果您还有任何问题,请告诉我!

标签: php arrays


【解决方案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
        )
)

【讨论】:

  • @KANDROID OS,很高兴!我可以帮助解决您的问题。
  • 我已经尝试在框架 Codeigniter 中进行它显示一个错误,他无法识别函数 comparevalue
  • @KANDROID OS,因为我不知道您使用 codeigniter 作为框架,所以我以一般方式回答您,但对于 Codeingiter 特定,您可以将 comparevalue 函数存储在帮助文件中,您可以自动-加载该帮助文件。希望它有助于解决您的问题。
  • 是的,这是我做的,我把它存储在一个助手中,非常感谢身体!
【解决方案2】:

你可以递归地这样做:

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

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

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

我刚刚注意到这个问题,所以我想我会提出来。根据您要执行的操作,您可能需要某种递归方面,就像我已经展示的那样。

希望这会有所帮助:)

【讨论】:

    猜你喜欢
    • 2017-10-09
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2020-07-20
    • 2013-11-08
    • 1970-01-01
    相关资源
    最近更新 更多