2014-03-02 50 views
2

我有兩個二維數組我會喜歡彼此比較:基於兩個二維數組的比較創建一個'結果'數組?

$array1 
Array 
(
    [0] => Array 
     (
      [A] => GB 
      [B] => Harry 
      [C] => British Army 
      [D] => Eton College 
      [E] => Cressida Bonas 
     ) 

    [1] => Array 
     (
      [A] => GB 
      [B] => William 
      [C] => Royal Air Force 
      [D] => Eton College 
      [E] => Catherine Middleton 
     ) 

) 

$array2 
Array 
(
    [0] => Array 
     (
      [A] => GB 
      [B] => Harry 
      [C] => British Army 
      [D] => Eton College 
      [E] => Cressida Bonas 
     ) 

    [1] => Array 
     (
      [A] => GB 
      [B] => James 
      [C] => British Army 
      [D] => Millfield 
      [E] => Unknown 
     ) 

) 

併產生一個布爾真/假結果排列如下,如果任何一個子陣列值的不同:

$results_array 
Array 
(
    [0] => Array 
     (
      [0] => true 
     ) 

    [1] => Array 
     (
      [0] => false  
     ) 

) 

更新: 這兩個數組將始終具有相同長度的父數組(但子數組的值可能會有所不同)。

我無法圍繞如何使用foreach以遞歸方式獲取結果數組。

任何一般想法或建議?

+0

你想什麼數據結果數組包含哪些內容?糾正我,如果我錯了 - 你想結果數組包含重複值的子數組和另一個具有不同的值? –

+3

使用'var_export'轉儲這兩個數組並更新您的問題。 –

+0

@JoshuaKissoon我想的結果陣列以含有一個布爾真或假的數據類型取決於任何子陣列的是否重複或沒有。例如對於重複而言是真的,對於不同的則是假的。將更新的問題,使這更清晰。 –

回答

0

你可以做使用==運營商。將第一個數組作爲鍵陣列($k=>$arr)[因爲該值是另一個數組]。現在使用簡單的==比較運算符比較兩個數組。您甚至可以使用===運算符執行嚴格的匹配。

<?php 
$arr1=array(0=>array('A'=>'GB','B'=>'Harry','C'=>'British Army'),1=>array('A'=>'GB','B'=>'William','C'=>'Royal Air Force')); 
$arr2=array(0=>array('A'=>'GB','B'=>'Harry','C'=>'British Army'),1=>array('A'=>'GB','B'=>'James','C'=>'British Army')); 

foreach($arr1 as $k=>$arr) 
{ 
    $resarr[][$k]=($arr==$arr2[$k])? "true" : "false"; 
} 
print_r($resarr); 

Demo

OUTPUT :

Array 
(
    [0] => Array 
     (
      [0] => true 
     ) 

    [1] => Array 
     (
      [1] => false 
     ) 

) 
+0

將在一分鐘內嘗試。看起來我正在試圖在腦海中形成一些東西,但無法得到。 –

+0

如果鍵不一樣,這將不起作用。例如,如果你有array1(1 =>「Harry」,2 =>「Paul」)和array2(1 =>「Paul」,2 =>「Harry」);這個答案將返回false,即使這些陣列彼此 –

+2

@JoshuaKissoon的副本,你沒看見我剛纔提到的''===運營商作爲備用??? **在發表評論之前,請正確閱讀答案。** –

0

我不知道你想用foreach循環做什麼。你是說每個陣列將有2 child arrays或每個孩子陣列將有5 values?無論如何,我希望這可以幫助你!

我會用一些這樣的:

  • array_intersect
  • array_intersect_assoc
  • array_diff
  • array_diff_assoc

代碼:

<?php 

$array1 = [ 
    [ 
     'A' => 'GB', 
     'B' => 'Harry', 
     'C' => 'British Army', 
     'D' => 'Eton College', 
     'E' => 'Cressida Bonas', 
    ], 
    [ 
     'A' => 'GB', 
     'B' => 'William', 
     'C' => 'Royal Air Force', 
     'D' => 'Eton College', 
     'E' => 'Catherine Middleton', 
    ] 
]; 

// What Values are in common 
$result1 = array_intersect_assoc($array1[0], $array1[1]); 
print_r($result1); 

$array2 = [ 
    [ 
     'A' => 'GB', 
     'B' => 'Harry', 
     'C' => 'British Army', 
     'D' => 'Eton College', 
     'E' => 'Cressida Bonas', 
    ], 
    [ 
     'A' => 'GB', 
     'B' => 'James', 
     'C' => 'British Army', 
     'D' => 'Millfield', 
     'E' => 'Unknown', 
    ] 
]; 

// What values are different 
$result2 = array_diff_assoc($array2[0], $array2[1]); 
print_r($result2); 


// A Way to check numerically 
$perfectMatch = 5; 
$intersect = array_intersect_assoc($array1[0], $array1[1]); 
$intersectCount = count($intersect); 
if ($intersectCount != $perfectMatch) { 
    echo "<br> Not Every value matches."; 
} else { 
    echo "<br> Perfect Match!"; 
} 

比較完整陣列$array1$array2你可以這樣做:

<?php 

// (With array code above) 

$c1 = count($array1); 
$c2 = count($array2); 
if ($c1 != $c2) { 
    echo "<br>Array Children must be the same"; 
} 

$result = []; 
for ($i = 0; $i < $c1; $i++) { 
    $in_common = array_intersect($array1[$i], $array2[$i]); 
    $result[] = count($intersect); 
} 

print_r($result); 
+0

將澄清我的問題。子數組可能會有所不同,但父數組將始終保持不變。 –

+0

謝謝,添加了一種方法來比較組。在這種情況下,你不需要驗證數組的孩子數:) – JREAM

0

您可以只使用array_map(),假設兩個數組的長度是相同的:

$result = array_map(function($a, $b) { 
    return [$a == $b]; // create single element boolean array 
}, $array1, $array2); 

您可以使用=====;如果兩個數組都具有相同的鍵和值對,前者(==)將產生true,而後者(===)將只產生true

0

一些答案使用==操作符;然而,如果數組沒有相同的key =>值匹配,那麼這將不起作用;試試這個:

$results = array(); 
foreach ($array1 as $i => $subarray) 
{ 
    /* No need to proceed if subarray[i] does not exist in the second array */ 
    if(!is_array($array2[$i])) 
    { 
     $results[$i] = false; 
     continue; 
    }   
    $results[$i] = (count(array_diff($array1[$i], $array2[$i])) == 0) ? true : false; 
} 

這個解決方案比使用==比較運算符要慢一點。然而,使用==不適用於以下情況:

$array1 => array(1 => "John", 2 => "James"); 
$array2 => array(1 => "James", 2 => "John"); 

這裏,鍵不一樣,但值重複。比較這些數組時,使用==的解決方案將返回false。

$array1 == $array2  // False 
+0

這個解決方案絕對是一個矯枉過正的問題。一個'count',一個'is_array()'檢查和一個'array_diff'。這些都沒有要求,你只是複雜的解決方案。 –

+0

它確實有一些額外的開銷,但適用於所有情況。如果您可以找到更好/更快的解決方案,包括解決即使存在重複陣列但鍵的順序不相同的情況,請發佈它。這就是我想出的。 –