2011-04-29 106 views
2

需要匹配2個多維數組中的2個鍵,並返回第一個數組中的匹配項(如果找到)。比較2個數組以匹配2個鍵

array1 => 

$arr[1] = array('fruit' => 'apple', 'ver' => '1', 'color' => 'blue', 'name' =>'joe'); 
$arr[2] = array('fruit' => 'peach', 'ver' => '2', 'color' => 'red', 'name' =>'jane'); 
$arr[3] = array('fruit' => 'apple', 'ver' => '1', 'color' => 'red', 'name' =>'jack'); 
$arr[4] = array('fruit' => 'apple', 'ver' => '4', 'color' => 'grey', 'name' =>'joe'); 



array2 => 

$arr[1] = array('fruit' => 'apple', 'ver' => '4', 'color' => 'red', 'name' =>'joe'); 
$arr[2] = array('fruit' => 'apple', 'ver' => '4', 'color' => 'red', 'name' =>'jane'); 

我需要匹配2個鍵值,在本例中只返回與array2匹配的array1中的匹配項。關鍵值例如是鍵 fruitname

在上面的例子可以看到這場比賽應該只返回$arr1$arr4array1,因爲他們在array2匹配$arr[1]。我只需要返回數組1的匹配。

這是一個例子,真實案例我不知道數組varibale指標或金額(可能每個數百個)。

+2

我猜你已經有$ arr [1],$ arr [2]等等,包含那些水果線,而不是4個完全獨立的數組? – 2011-04-29 20:16:03

+2

我沒有看到任何多維數組 – andrewtweber 2011-04-29 20:17:48

+0

你是說你不知道'關鍵值'可能是什麼?這些信息是如何提供的? – 2011-04-29 20:31:11

回答

1
$array = (
    0 => array('fruit' => 'apple' etc.... 
    etc... 
); 

$find_these = array('fruit' => 'apple', 'ver' => 4, 'color' => red, etc...); 

$fruit = $find_these['apple']; 
$ver = $find_these['ver']; 

$found = array(); 

foreach($array as $key => $subarray) { 
    if (($subarray['fruit'] == $fruit) && ($subarray['ver'] == $ver)) 
     $found[$key] = $subarray; 
    } 
} 

在此之後,$ found將是一個新的數組,其中包含所有具有匹配水果/域的子數組的拷貝。

0

這應該非常粗略地工作。然而,我會在真正的解決方案中分裂成多種方法。

$fruit_list = array(); 
$fruit_list[ 1 ] = array('fruit' => 'apple', 'ver' => '1', 'color' => 'blue', 'name' => 'joe'); 
$fruit_list[ 2 ] = array('fruit' => 'peach', 'ver' => '2', 'color' => 'red', 'name' => 'jane'); 
$fruit_list[ 3 ] = array('fruit' => 'apple', 'ver' => '1', 'color' => 'red', 'name' => 'jack'); 
$fruit_list[ 4 ] = array('fruit' => 'apple', 'ver' => '4', 'color' => 'grey', 'name' => 'joe'); 

$fruits = array(); 
$fruits[ 1 ] = array('fruit' => 'apple', 'ver' => '4', 'color' => 'red', 'name' => 'joe'); 
$fruits[ 2 ] = array('fruit' => 'apple', 'ver' => '4', 'color' => 'red', 'name' => 'jane'); 

$keys = array(); 

foreach ($fruits as $fruit) { 
    foreach ($fruit_list as $list_key => $list_item) { 
     if (in_array($fruit[ 'fruit' ], $list_item) && in_array($fruit[ 'name' ], $list_item)) { 
      $keys[ ] = $list_key; 
     } 
    } 
} 

var_dump($keys); 

輸出:

array(2) { 
    [0]=> 
    int(1) 
    [1]=> 
    int(4) 
} 
0

隨着PHP 5.3的爲了方便匿名函數,你可以這樣寫功能:

function compare_arrays($primary, $secondary, $matchKeys) { 
    $comparer = function($x, $y) use ($matchKeys) { 
     foreach ($matchKeys as $key) { 
      if ($x[$key] < $y[$key]) { 
       return -1; 
      } 
      else if($x[$key] > $y[$key]) { 
       return 1; 
      } 
     } 

     return 0; 
    }; 

    return array_uintersect($primary, $secondary, $comparer); 
} 

這可以這樣使用:

$arr1 = array(); 
$arr1[] = array('fruit' => 'apple', 'ver' => '1', 'color' => 'blue', 'name' =>'joe'); 
$arr1[] = array('fruit' => 'peach', 'ver' => '2', 'color' => 'red', 'name' =>'jane'); 
$arr1[] = array('fruit' => 'apple', 'ver' => '1', 'color' => 'red', 'name' =>'jack'); 
$arr1[] = array('fruit' => 'apple', 'ver' => '4', 'color' => 'grey', 'name' =>'joe'); 

$arr2 = array(); 
$arr2[] = array('fruit' => 'apple', 'ver' => '4', 'color' => 'red', 'name' =>'joe'); 
$arr2[] = array('fruit' => 'apple', 'ver' => '4', 'color' => 'red', 'name' =>'jane'); 

print_r(compare_arrays($arr1, $arr2, array('fruit', 'name'))); 

前兩個arg你的陣列是你的陣列。第三個參數是一組鍵,它們必須匹配才能被認爲是相等的兩個元素。

當第一個數組中的元素被認爲與第二個數組中的任何元素相等時,第一個元素($primary)被視爲匹配。 compare_array返回一個包含所有這些匹配的數組。