2011-04-29 109 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返回一个包含所有这些匹配的数组。