2016-12-25 113 views
1

我将比较两个阵列。 $db是第一个数组,$tr是第二个数组。将$tr$db进行比较。如果的值在$db。然后$result包含$tr值:PHP比较或搜索两个不同阵列的阵列

所述第一阵列是$db

$db = [ 
     ['a','d'], 
     ['a','e','f'], 
     ['g'], 
     ['b','e','d'], 
     ['a','d','c','e'], 
     ['d','g'], 
     ['c','a','h','e','f','h'], 
     ['g','e','h'], 
     ['d','f','b','h','g'] 
    ]; 

的第二阵列是$tr

$tr = [ 
     ['a','b'], 
     ['a','c'], //in 
     ['a','d'], //in 
     ['b','c'], 
     ['b','d'], //in 
     ['c','d'], 
    ]; 

如果$db$tr比它产生

将有结果$result这样的:

$result = [ 
     ['a','c'], 
     ['a','d'], 
     ['b','d'] 
    ]; 
+0

什么是你的“包含”的定义?我有一段我愿意发布的代码,但是它还会在结果中添加'['c','d']',因为'c'和'd'包含在'['a'中, 'd','c','e']'。是对的吗? – GolezTrol

+0

例如:['a','b']在['a','d','b']中,则将['a','b']插入变量$ result –

回答

1

圣诞快乐!

我不认为PHP有​​一个标准的功能来解决这个问题(虽然我可能错过了你)。有大量的数组函数,但其​​中大多数不适用于嵌套数组,或者只执行特定任务。

但是,自己编写一个函数通常很容易,如果可以的话,利用内置函数。

下面的函数迭代$ tr中的每个项目。对于每个项目,它迭代$ dm的项目。然后它使用array_diff获取dm项目中缺失的项目列表。如果该列表为空,则表示来自第一个数组的所有项都包含在第二个数组中,并且第一个数组应该在结果中。

我注意到这个函数在结果中也返回['c', 'd'],因为cd都包含在$dm的一个数组中。所以也许你错过了那个,或者我没有正确理解规格。无论如何,这应该让你开始至少:

<?php 

$db = [ 
     ['a','d'], 
     ['a','e','f'], 
     ['g'], 
     ['b','e','d'], 
     ['a','d','c','e'], 
     ['d','g'], 
     ['c','a','h','e','f','h'], 
     ['g','e','h'], 
     ['d','f','b','h','g'] 
    ]; 

$tr = [ 
     ['a','b'], 
     ['a','c'], //in 
     ['a','d'], //in 
     ['b','c'], 
     ['b','d'], //in 
     ['c','d'], 
    ]; 


function nested_array_intersect($source, $comparewith) { 
    $result = array(); 

    foreach ($source as $sItem) { 

    foreach ($comparewith as $cwItem) { 

     $missingItems = array_diff($sItem, $cwItem); 

     if (count($missingItems) === 0) { 

     $result[] = $sItem; 
     break; 

     } 
    } 
    } 
    return $result; 
} 

$result = nested_array_intersect($tr, $db); 

print_r($result); 
+0

圣诞快乐。谢谢 –

0
function compare($db, $tr) 
{ 
    $result = []; 

    foreach ($db as $val) { 
     $dbformat[] = implode("", $val); 
    } 

    foreach ($tr as $val) { 
     $pattern = ""; 
     foreach($val as $one) { 
      $pattern .= $one.".*?"; 
     } 
     foreach ($dbformat as $value) { 
      $countMatch = preg_match("/".$pattern."/", $value); 
      if($countMatch) { 
       $result[] = $val; 
       break; 
      } 
     } 
    } 

    return $result; 
}