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递归方式使用来获取结果数组。

有什么一般的想法或建议吗?

4

4 回答 4

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);
于 2014-03-02T10:04:57.857 回答
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
        )

)
于 2014-03-02T10:06:18.233 回答
0

您可以只使用array_map(),假设两个数组的长度相同:

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

您可以使用=====; 如果两个数组具有相同的键值对,前者 ( ) 将产生,而后者 ( )==仅在两个数组的键也以相同顺序排列时才会产生。true===true

于 2014-03-02T10:12:49.343 回答
0

一些答案使用 == 运算符;但是,如果数组没有相同的 key=>value 匹配,这将不起作用;尝试这个:

$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
于 2014-03-02T10:19:43.707 回答