2016-12-25 137 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; 
}