PHP数组键的精确匹配

3

我有一个搜索查询,形式为以下数组:

$searcharray = array('blue'  => 1, 'red'  => 2);

我所编写的代码返回多个结果数组,每个数组都包含搜索数组的键值对。有些结果还有额外的键值对:
$resultsarray1 = array('blue' => 1, 'red'  => 2, 'yellow' => 7);
$resultsarray2 = array('green' => 5, 'blue' => 1, 'red'  => 2, 'yellow' => 7, 'cyan'   => 8);
$resultsarray3 = array('blue' => 1, 'red'  => 2, 'yellow' => 7, 'cyan'   => 8);
$resultsarray4 = array('blue' => 1, 'red'  => 2);
$resultsarray5 = array('red'  => 2, 'blue' => 1);
$resultsarray6 = array('blue' => 1, 'red'  => 2, 'cyan'   => 8);

我想编写一个函数,用于将这些结果数组与搜索数组进行比较,并仅返回在搜索数组中具有完全匹配键的数组。也就是说,对于上面的示例,该函数应返回$resultarray4和$resultarray5作为与搜索数组匹配的结果。键的顺序不重要。
我尝试了各种组合的php交集数组函数,但没有产生所需的结果。

你的问题有一点混淆。你只需要匹配键吗?还是值也要匹配? - Hanky Panky
只需要键。值可以不同。 - Vinayak
3个回答

2

您可能不知道,但您可以简单地使用==进行数组比较。

if($array1==$array2)
{
     //same key value pairs
}

Fiddle

var_dump($searcharray==$resultsarray1);
var_dump($searcharray==$resultsarray2);
var_dump($searcharray==$resultsarray3);
var_dump($searcharray==$resultsarray4);
var_dump($searcharray==$resultsarray5);
var_dump($searcharray==$resultsarray6);

输出

bool(false)
bool(false)
bool(false)
bool(true)      //4
bool(true)      //5
bool(false)

有趣的是

如果你想更加严格,要求即使键的顺序相同也应该返回true,那么你可以简单地使用===

Fiddle


1
我喜欢这种看起来很难实际上却非常简单的感觉。 :) 很好的答案。 - TunaMaxx
@TunaMaxx:“返回仅包含与搜索数组中键的精确匹配的数组”。这将检查键和值。 - Amadan
@Amadan 确实。我已经考虑到了这一点并添加了一个答案。 - TunaMaxx

2

根据Amadan的评论,这个函数将仅比较键,而不考虑键的顺序(但是第三个参数可以配置):

function find_indentical_keys($array1 = array(), $array2 = array(), $ignore_key_order = true)
{
    if ($ignore_key_order)
    {
        ksort($array1);
        ksort($array2);
    }

    return array_keys($array1) === array_keys($array2);
}

使用方法如下(将$ resultsarrays转换为数组,使其易于使用):

$searcharray = array('blue'  => 1, 'red'  => 2);

$resultsarray[1] = array('blue' => 1, 'red'  => 2, 'yellow' => 7);
$resultsarray[2] = array('green' => 5, 'blue' => 1, 'red'  => 2, 'yellow' => 7, 'cyan'   => 8);
$resultsarray[3] = array('blue' => 1, 'red'  => 2, 'yellow' => 7, 'cyan'   => 8);
$resultsarray[4] = array('blue' => 1, 'red'  => 2);
$resultsarray[5] = array('red'  => 2, 'blue' => 1);
$resultsarray[6] = array('blue' => 1, 'red'  => 2, 'cyan'   => 8);

foreach ($resultsarray as $key => $array)
{
    echo 'Array #' . $key . ' ';
    echo (find_indentical_keys($searcharray, $array)) ? 'MATCHES' : 'does NOT match';
    echo ' the search array.<br />';
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接