比较2个数组以匹配2个键

时间:2011-04-29 20:14:24

标签: php arrays compare

需要匹配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个键值,在此示例中仅返回array1中与array2匹配的匹配项。例如,键值是键 fruitname

在上面的示例中,您可以看到此匹配应仅返回$arr1的{​​{1}}和$arr4,因为它们与array1中的$arr[1]匹配。我只需要为array1返回匹配项。

这是一个例子,真实情况我不知道数组varibale指标或数量(可能每个数百)。

3 个答案:

答案 0 :(得分: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将是一个新数组,其中包含具有匹配的fruit / ver字段的所有子数组的副本。

答案 1 :(得分: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)
}

答案 2 :(得分: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')));

前两个参数是你的数组。第三个参数是一个键数组,它们必须匹配两个元素才能被认为是相等的。

当第一个数组中的元素被认为等于第二个数组的任何元素时,第一个数组中的元素($primary)被认为是匹配的。 compare_array返回包含所有这些匹配项的数组。